Comment dessiner un texte RTL (arabe) sur un bitmap et le commander correctement?
-
07-07-2019 - |
Question
J'essaie de dessiner du texte arabe sur un bitmap pour affichage:
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);
La classe ArabicUtilities est un outil permettant de remodeler le texte Unicode afin que les lettres soient connectées. voir: http://github.com/agawish/Better-Arabic-Reshaper/
Cependant, le bitmap généré ressemble à ceci:
texte alternatif http://imagebin.ca/img/J1EB8DWc.jpg
Quand cela devrait ressembler à Anglais
Je pense que le problème tient au fait que, contrairement à un TextView , la classe Bitmap n’est pas consciente de BiDi, elle dessine donc les lettres de gauche à écrire.
Malgré tous mes efforts, je ne vois pas comment dessiner le texte dans le bon ordre.
La solution
Canvas est pratiquement une enveloppe autour de Canvas of Skia (moteur graphique natif). Skia n'effectue pas de BiDi / remodelage, il dessine simplement des séquences de glyphes.
TextView, au contraire, utilise une charge d'objets liés au texte d'Android, parmi lesquels Layout et des classes dérivées qui font un BiDi simple (voire stupide). BiDi d'Android est très stupide de ne pas pouvoir gérer les chiffres dans RTL: "???? 180" est affiché "???? 081".
Personnellement, je ne fais pas confiance au BiDi actuel d’Android, et j’écrirais ma propre classe conforme à la norme Unicode-BiDi et l’utiliserai au besoin. Je vous suggère d'utiliser BiDi manuel en plus du remodelage manuel bro. Rappelez-vous: d'abord BiDi, puis remodelez!
Salam