Wie RTL Text (Arabisch) auf eine Bitmap zeichnen und hat es bestellt richtig?
-
07-07-2019 - |
Frage
Ich versuche, arabischen Text auf eine Bitmap zur Anzeige zu ziehen:
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);
Die ArabicUtilities Klasse ist ein Werkzeug, um den Unicode-Text neu zu gestalten, so werden die Buchstaben verbunden. siehe: http://github.com/agawish/Better-Arabic-Reshaper/
Allerdings ist die Bitmap, die wie folgt aussieht erzeugt wird:
alt text http://imagebin.ca/img/J1EB8DWc.jpg
Wenn es soll wie folgt aussehen يجري
Ich glaube, das Problem liegt daran, dass, im Gegensatz zu einem Textview , die Bitmap-Klasse ist nicht BiDi bewusst, so zieht die Buchstaben von links zu schreiben.
Versuchen Sie, wie ich könnte, ich kann nicht herausfinden, wie der Text in der richtigen Reihenfolge zu ziehen.
Lösung
Canvas ist praktisch ein Wrapper um die Leinwand von Skia (native Grafik-Engine). Skia führt keine BiDi / Umbildung, es einfach Sequenzen von Glyphen zieht.
Textview, auf der anderen Art und Weise, verwendet eine Last von Androids textbezogene Objekte, darunter Layout- und abgeleiteten Klassen, die einfach tun (eigentlich stumm) BiDi. Android BiDi ist sehr dumm, dass es nicht einmal Ziffern in RTL umgehen kann. ‚طولي 180‘ angezeigt ‚طولي 081‘
persönlich traue ich nicht Androids aktuelle BiDi, und würde meine eigene Unicode-BiDi-konforme Klasse schreiben und es verwenden, wenn ich brauche. Ich schlage vor, Sie verwenden Sie die manuelle BiDi zusätzlich zur manuellen Umformungs bro. Denken Sie daran: Erste BiDi, dann umformen
Salam