android - 基于 String 内部语言的 TextView 自定义字体

标签 android android-custom-view android-fonts

我有两个字体 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

因此现在可以根据语言方向轻松构建 TypefaceSpanMetricAffectingSpan,如下所示:

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/

相关文章:

android - 当显示和字体尺寸较大时,手动计算可用宽度不正确

android - React-Native ToolbarAndroid 不支持 fontFamily

机器人 : html loaded without font

android - 关闭 RecyclerView 子尺寸变化动画

android - 比较android中的两个Arraylists

android - 无法在三星设备上分配变量 [OpenGL ES]

java - 使用PHP、MySQL的Android登录注册系统出现错误 'java.lang.NoSuchMethodError: org.apache.http.impl.client.DefaultHttpClient.execute'

android - 在自定义 ScrollView onScrollChanged 中更改 View 高度

Android - Canvas.clipRect() - 删除现有剪辑

android - Rxjava, combineLatest 与 RxTextView 内存泄漏