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

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);

arabicutities类是一个重塑unicode文本的工具,以便将字母连接起来。参阅:http://github.com/agawish/Better-Arabic-Reshaper/
但是,生成的位图如下所示:
alt text http://imagebin.ca/img/J1EB8DWc.jpg
什么时候看起来像
我认为问题在于,与TextView不同,bitmap类不知道bidi,因此它从左开始绘制字母。
尽管我尽力了,我还是不知道如何按正确的顺序画文本。

最佳答案

canvas实际上是skia(本地图形引擎)画布的包装器。skia不执行任何bidi/整形,它只是绘制字形序列。
另一方面,textview使用了大量android的文本相关对象,其中包括布局和派生类,它们执行简单(实际上是哑的)bidi。android的bidi非常愚蠢,它甚至不能处理rtl中的数字:“__180”显示为“__081”。
就我个人而言,我不信任android当前的bidi,我会编写自己的unicode bidi兼容类并在需要时使用它。我建议你除了手动整形外,还可以使用手动bidi。记住:先比迪,然后重塑!
萨拉姆

10-08 01:19