2009-09-13 8 views
3

J'essaie de dessiner le texte arabe sur un Bitmap pour l'affichage:Comment dessiner du texte RTL (arabe) sur un bitmap et le faire commander correctement?

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 pour remodeler le texte unicode pour que les lettres sont connectées. voir: http://github.com/agawish/Better-Arabic-Reshaper/

Cependant, le bitmap généré ressemble à ceci:

alt text http://imagebin.ca/img/J1EB8DWc.jpg

Quand il devrait ressembler يجري

Je crois que la question est parce que, contrairement à un TextView, la classe Bitmap n'est pas sensible à BiDi, donc elle dessine les lettres de gauche à écrire.

Essayez comme je pourrais, je ne peux pas comprendre comment dessiner le texte dans le bon ordre.

+0

Vous n'avez aucun conseil, mais avez-vous déposé un rapport de bogue? –

Répondre

5

Canvas est pratiquement une enveloppe autour de la toile de Skia (moteur graphique natif). Skia n'effectue pas de BiDi/remodelage, il dessine simplement des séquences de glyphes. D'autre part, TextView utilise une charge d'objets liés au texte d'Android, parmi lesquels des classes Layout et des classes dérivées qui font de simples BiDi (réellement stupides). Le BiDi d'Android est très bête qu'il ne peut même pas gérer les chiffres dans RTL: '180' s'affiche '' 08 ''.

Personnellement, je ne fais pas confiance au BiDi actuel d'Android, et j'écrirais ma propre classe compatible Unicode-BiDi et l'utiliserais si j'en avais besoin. Je suggère que vous utilisiez le BiDi manuel en plus du bridage manuel du remodelage. Rappelez-vous: d'abord BiDi, puis remodeler!

Salam

+0

Avez-vous des suggestions pour des implémentations BiDi librement disponibles que je pourrais intégrer dans mon application? – Casey

+0

Je pense que le document bidi Unicode officiel (http://unicode.org/reports/tr9/) inclut des implémentations Java et C++ suggérées, parions que celles-ci n'incluent aucune optimisation nécessaire pour les périphériques à ressources limitées tels que les téléphones. –

Questions connexes