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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top