Como desenhar texto RTL (árabe) em um Bitmap e tê-lo ordenado corretamente?
-
07-07-2019 - |
Pergunta
Eu estou tentando desenhar texto em árabe em um Bitmap para exibição:
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);
A classe ArabicUtilities é uma ferramenta para reformular o texto unicode assim que as letras estão conectados. ver: http://github.com/agawish/Better-Arabic-Reshaper/
No entanto, o bitmap que é gerado parece com isso:
alt texto http://imagebin.ca/img/J1EB8DWc.jpg
Quando ele deve ser parecido ????
Creio que a questão é porque, ao contrário de um TextView , a classe Bitmap não tem conhecimento BiDi, por isso atrai as letras da esquerda para a gravação.
Tente como eu poderia, eu não posso descobrir como desenhar o texto na ordem correta.
Solução
Canvas é praticamente um invólucro em torno do Canvas de Skia (motor gráfico nativos). não Skia não realizar nenhuma BiDi / remodelar, ele simplesmente chama seqüências de glifos.
TextView, por outro lado, usa uma carga de objetos relacionados com o texto do Android, entre eles Layout e classes derivadas que fazem simples (na verdade mudo) BiDi. do Android BiDi é muito burra que não pode sequer lidar com dígitos em RTL: '???? 180' é exibido '???? 081'
.Pessoalmente eu não confio atual BiDi do Android, e iria escrever minha própria classe compatível com Unicode BiDi e usá-lo se eu precisar. Eu sugiro que você use manual de BiDi além do bro reformulação manual. Lembre-se: Primeira BiDi, então reformular
Salam