我正在尝试将阿拉伯文字绘制到位图上以供显示:

Bitmap img = Bitmap.createBitmap( (int) f+100, 300, Config.RGB_565);
Canvas c = new Canvas();
c.setBitmap(  img );
mFace = Typeface.createFromAsset(getAssets(),"DejaVuSansCondensed.ttf");
mPaint.setTypeface(mFace);
content = "يجري";
content = ArabicUtilities.reshape( content );
System.out.println("Drawing text: " + content);
c.drawText(content, 30, 30, mPaint);

ArabicUtilities类是重塑unicode文本的工具,因此字母已连接。请参阅: http://github.com/agawish/Better-Arabic-Reshaper/

但是,生成的位图如下所示:

alt text http://imagebin.ca/img/J1EB8DWc.jpg

它应该看起来像يجري

我认为问题是因为,与 TextView 不同, Bitmap类不支持BiDi,因此它从左侧绘制字母以进行写入。

尽我所能,我无法弄清楚如何以正确的顺序绘制文本。

有帮助吗?

解决方案

Canvas实际上是围绕Skia Canvas(本机图形引擎)的包装器。 Skia不执行任何BiDi /重塑,它只是绘制字形序列。

另一方面,TextView使用了大量Android的文本相关对象,其中包括简单(实际上是愚蠢的)BiDi的布局和派生类。 Android的BiDi非常愚蠢,它甚至无法处理RTL中的数字:'طولي180'显示'طولي081'。

就我个人而言,我不相信Android目前的BiDi,并且会编写我自己的Unicode-BiDi兼容类并在需要时使用它。我建议您使用手动BiDi以及手动重塑兄弟。记住:第一个BiDi,然后重塑!

萨拉姆

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top