4

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

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/aawish/Better-Arabic-Reshaper/

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

替代文字 http://imagebin.ca/img/J1EB8DWc.jpg

当它看起来像يجري

我认为问题在于,与TextView不同,Bitmap 类不支持 BiDi,因此它从左侧绘制字母来书写。

尽我所能,我不知道如何以正确的顺序绘制文本。

4

2 回答 2

5

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

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

就我个人而言,我不信任 Android 当前的 BiDi,并且会编写我自己的 Unicode-BiDi 兼容类并在需要时使用它。我建议你除了手动重塑兄弟之外,还使用手动 BiDi。记住:先BiDi,再重塑!

萨拉姆

于 2010-03-05T17:07:03.103 回答
0

如果你在 textview 中添加了单行属性,你应该删除这个属性并添加 maxLines="1"

于 2019-07-23T06:24:11.493 回答