RTLテキスト(アラビア語)をビットマップに描画し、適切に順序付けする方法は?

StackOverflow https://stackoverflow.com/questions/1417503

  •  07-07-2019
  •  | 
  •  

質問

表示用にビットマップにアラビア語のテキストを描画しようとしています:

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/

ただし、生成されるビットマップは次のようになります。

代替テキストhttp://imagebin.ca/img/J1EB8DWc.jpg

يجري

のように見える場合

問題は、 TextView とは異なり、 BitmapクラスはBiDiに対応していないため、左から文字を描画して書き込みます。

試してみると、正しい順序でテキストを描画する方法がわかりません。

役に立ちましたか?

解決

Canvasは、実質的にCanvas of Skia(ネイティブグラフィックエンジン)のラッパーです。 SkiaはBiDi /再整形を実行せず、単にグリフのシーケンスを描画します。

TextViewは、他の方法では、Androidのテキスト関連オブジェクトの負荷を使用します。その中には、レイアウトと、単純な(実際には愚かな)BiDiを行う派生クラスがあります。 AndroidのBiDiは非常に愚かで、RTLの数字を処理することすらできません。「طولي180」は「طولي081」と表示されます。

個人的には、Androidの現在のBiDiを信頼せず、独自のUnicode-BiDi準拠クラスを作成し、必要に応じて使用します。手動の再形成ブロに加えて、手動のBiDiを使用することをお勧めします。覚えておいてください:最初にBiDi、次に形を変えてください!

サラム

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top