我有两个字体 ttf 文件,必须根据 String
中的语言应用于 TextView
。所以例如考虑这个示例文本:
hey what's up ضعيف
我可以申请一个 typeface span基于语言,但它需要在从我们的服务器获取的每个字符串中进行自定义标记,例如
<ttf1>hey what's up <ttf1><ttf2>ضعيف</ttf2>
并且在运行时解析每个 String
会影响性能。有没有其他方法可以实现这一点?
首先让我们说我需要这样做只是为了文本的方向,即 RTL 和 LTR,所以在上面的例子中,英语是 LTR,阿拉伯语是 RTL。这会有什么不同吗?
我曾尝试合并这两个字体文件,但存在行高问题,如果我为一个字体文件修复它,它会在其他文件中损坏。
最佳答案
在某人的帮助下,我找到了比手动标记更优雅的解决方案:
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);
}
打印:
hey what's up is ltr
ضعيف is 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);
关于android - 基于 String 内部语言的 TextView 自定义字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26903712/