Как нарисовать текст RTL (арабский) на растровое изображение и правильно ли он упорядочен? - PullRequest
3 голосов
/ 13 сентября 2009

Я пытаюсь нарисовать арабский текст на растровое изображение для отображения:

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);

Класс ArabicUtilities - это инструмент для изменения текста Юникода, чтобы буквы были связаны. см .: http://github.com/agawish/Better-Arabic-Reshaper/

Однако генерируемое растровое изображение выглядит следующим образом:

альтернативный текст http://imagebin.ca/img/J1EB8DWc.jpg

Когда это должно выглядеть как يجري

Я считаю, что проблема в том, что, в отличие от TextView , класс Bitmap не поддерживает BiDi, поэтому он рисует буквы слева для записи.

Как ни старайся, я не могу понять, как нарисовать текст в правильном порядке.

1 Ответ

5 голосов
/ 05 марта 2010

Canvas - это обертка вокруг Canvas of Skia (родной графический движок). Skia не выполняет BiDi / изменение формы, она просто рисует последовательности глифов.

TextView, с другой стороны, использует загрузку текстовых объектов Android, в том числе Layout и производных классов, которые делают простой (на самом деле тупой) BiDi. Android BiDi очень тупой, он не может даже обрабатывать цифры в RTL: «طولي 180» отображается «طولي 081».

Лично я не доверяю текущей версии Android BiDi, и написал бы свой собственный класс, совместимый с Unicode-BiDi, и использовал бы его, если мне нужно. Я предлагаю вам использовать ручной BiDi в дополнение к ручному изменению формы, братан. Помните: сначала BiDi, затем измените форму!

Салам

...