Pregunta

Estoy tratando de dibujar texto árabe en un mapa de bits para mostrarlo:

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 clase ArabicUtilities es una herramienta para remodelar el texto unicode para que las letras estén conectadas. ver: http://github.com/agawish/Better-Arabic-Reshaper/

Sin embargo, el mapa de bits generado se ve así:

texto alternativo http://imagebin.ca/img/J1EB8DWc.jpg

Cuándo debería verse como ????

Creo que el problema se debe a que, a diferencia de un TextView , la clase de mapa de bits no reconoce BiDi, por lo que dibuja las letras de la izquierda para escribir.

Por mucho que lo intente, no puedo entender cómo dibujar el texto en el orden correcto.

¿Fue útil?

Solución

Canvas es prácticamente un envoltorio alrededor del Canvas de Skia (motor de gráficos nativo). Skia no realiza ninguna BiDi / remodelación, simplemente dibuja secuencias de glifos.

TextView, por otro lado, utiliza una carga de objetos relacionados con el texto de Android, entre ellos Layout y clases derivadas que hacen BiDi simple (realmente tonto). El BiDi de Android es muy tonto porque ni siquiera puede manejar dígitos en RTL: '& # 1591; & # 1608; & # 1604; & # 1610; 180 'se muestra' & # 1591; & # 1608; & # 1604; & # 1610; 081 '.

Personalmente, no confío en el BiDi actual de Android, y escribiría mi propia clase compatible con Unicode-BiDi y la usaría si lo necesito. Le sugiero que use BiDi manual además del hermano de remodelación manual. Recuerde: ¡Primero BiDi, luego remodele!

Salam

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top