如何将RTL文本(阿拉伯文)绘制到位图上并正确排序?

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/agawish/Better-Arabic-Reshaper/ 然而,生成的位图看起来像这样: alt text http://imagebin.ca/img/J1EB8DWc.jpg 当它应该看起来像يجري 我认为问题在于,与TextView不同,Bitmap类不具备双向文本处理能力,因此它从左到右绘制字母。
尽管我尝试了很多次,但我仍然无法弄清如何以正确的顺序绘制文本。

没有什么建议,但你是否已经提交了错误报告? - Jeremy Logan
2个回答

5
Canvas实际上是Skia的Canvas(本地图形引擎)的包装器。Skia不执行任何BiDi /重塑操作,它只是绘制字形序列。而TextView则使用了许多Android的文本相关对象,其中包括Layout和派生类,这些类执行简单(实际上是愚蠢的)BiDi。Android的BiDi很愚蠢,甚至无法处理RTL中的数字:“طولي 180”显示为“طولي 081”。个人而言,我不信任Android当前的BiDi,并且如果需要的话,会编写自己的Unicode-BiDi兼容类并使用它。我建议您在手动重塑之前使用手动BiDi。记住:先进行BiDi,然后再进行重塑!Salam

你有没有关于可自由使用的BiDi实现的建议,我可以将其集成到我的应用程序中? - Casey
我认为官方的Unicode双向文档(http://unicode.org/reports/tr9/)包括建议的Java和C++实现,但这些实现没有针对诸如手机等资源有限设备所必需的优化。 - Tareq Sha

1

如果您向TextView添加了单行属性,您应该删除此属性并添加maxLines="1"


它帮了我,谢谢!你能解释一下它是如何工作的吗? - Aleksey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接