Come disegnare un testo RTL (arabo) su una bitmap e averlo ordinato correttamente?
-
07-07-2019 - |
Domanda
Sto cercando di disegnare il testo arabo su una bitmap per la visualizzazione:
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 è uno strumento per rimodellare il testo unicode in modo che le lettere siano collegate. vedi: http://github.com/agawish/Better-Arabic-Reshaper/
Tuttavia, la bitmap generata è simile alla seguente:
alt text http://imagebin.ca/img/J1EB8DWc.jpg
Quando dovrebbe apparire come يجري
Credo che il problema sia perché, diversamente da un TextView , la classe Bitmap non è a conoscenza di BiDi, quindi disegna le lettere da sinistra per scrivere.
Prova come potrei, non riesco a capire come disegnare il testo nell'ordine corretto.
Soluzione
Canvas è praticamente un involucro attorno a Canvas of Skia (motore grafico nativo). Skia non esegue alcun BiDi / rimodellamento, disegna semplicemente sequenze di glifi.
TextView, d'altra parte, utilizza un carico di oggetti relativi al testo di Android, tra cui layout e classi derivate che fanno un BiDi semplice (in realtà stupido). Il BiDi di Android è molto stupido e non riesce nemmeno a gestire le cifre in RTL: '& # 1591; & # 1608; & # 1604; & # 1610; Viene visualizzato 180 '' & # 1591; & # 1608; & # 1604; & # 1610; 081' .
Personalmente non mi fido dell'attuale BiDi di Android e scrivo la mia classe conforme Unicode-BiDi e la uso se ne ho bisogno. Ti suggerisco di usare il BiDi manuale oltre al fratello rimodellante manuale. Ricorda: prima BiDi, quindi rimodella!
Salam