Как нарисовать текст RTL (арабский) на растровом изображении и правильно его упорядочить?

StackOverflow https://stackoverflow.com/questions/1417503

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Салам

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top