Пользовательские шрифты для текстового представления, основанные на языках внутри строки
У меня есть два файла шрифта ttf, которые должны быть применены на TextView
на основе языков внутри String
. Поэтому, например, рассмотрим этот пример текста:
Эй, как дела ضعيف
Я могу просто применить Typeface span на основе языка, но он требует пользовательской разметки в каждой строке, которая извлекается с нашего сервера, например
<ttf1>hey what's up <ttf1><ttf2>ضعيف</ttf2>
И разбор каждого String
во время выполнения даст хит производительности. Есть ли какой-то другой подход для достижения этой цели?
Для начала скажем I нужно сделать это только для направления текста, т. е. RTL и LTR, поэтому в приведенном выше примере английский-LTR, а арабский-RTL. Будет ли это по-другому?
Я пытался объединить эти два файла шрифтов, но есть проблемы с высотой строки, и если я исправлю это для одного файла шрифта, он будет сломан для другого файла.
1 ответ:
Я нашел более элегантное решение, чем ручная разметка с помощью кого-то :
String paragraph = "hey what's up ضعيف"; int NO_FLAG = 0; Bidi bidi = new Bidi(paragraph, NO_FLAG); int runCount = bidi.getRunCount(); for (int i = 0; i < runCount; i++) { String ltrtl = bidi.getRunLevel(i) % 2 == 0 ? "ltr" : "rtl"; String subString = paragraph.substring(bidi.getRunStart(i), bidi.getRunLimit(i)); Log.d(">>bidi:" + i, subString+" is "+ltrtl); }
Отпечатки пальцев:
Эй, что такое ltr
{[4] }ععيف-rtlТак что теперь можно легко построить
TypefaceSpan
илиMetricAffectingSpan
на основе направления языка, как это:SpannableString spanString = new SpannableString(paragraph); for (int i = 0; i < runCount; i++) { Object span = bidi.getRunLevel(i) % 2 == 0 ? ltrFontSpan : rtlFontSpan; spanString.setSpan(span, bidi.getRunStart(i), bidi.getRunLimit(i), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } textView.setText(spanString);