有没有办法回退到静态布局中的 Typeface.SERIF?

Posted

技术标签:

【中文标题】有没有办法回退到静态布局中的 Typeface.SERIF?【英文标题】:Is there a way to fall back to Typeface.SERIF in a StaticLayout? 【发布时间】:2016-12-19 02:19:51 【问题描述】:

我正在创建一个自定义 View 类,它使用 StaticLayout 和从 .ttf 资产文件加载的自定义字体显示文本。字体的基本外观是衬线字体,字体文件中的 TrueType 属性表明它是衬线字体。然而,对于不在字体中的字符,android 会退回到无衬线字体(它看起来像 Roboto 或 Noto,具体取决于 Android 版本)。

有没有办法控制这一点,以便 Android 布局引擎回退到衬线字体? (比如可能是一些魔术字符串传递给Paint#setFontFeatureSettings(),或者可能是一种指定用于Paint 的字体堆栈的方法?)

任何解决方案都必须在应用分发后才能工作,因此不能选择使用 Android 的系统配置文件玩游戏。另外,我知道this question(四年后仍未得到答复),但我的问题有点不同,尽管这两个问题的解决方案很可能是相同的。

【问题讨论】:

【参考方案1】:

对于 Lollipop,有一个名为 FontFamily 的隐藏类和一个名为 Typeface.createFromFamilies 的隐藏方法。如果您非常小心,您可能可以通过反射或其他技巧来使用这些东西,但要准备好回退到公共 API。

【讨论】:

不幸的是,在 Android Pie 中,FontFamily 类似乎位于深灰色列表中,因此即使通过反射也无法访问。 (见developer.android.com/about/versions/pie/…)。 是的,时间已经证明了我的建议是明智的,即能够依靠公共 API 大声笑。不幸的是,隐藏了这么多 Android 框架,通常没有任何充分的理由。例如,有一个公共方法创建了一个复制FileDescriptorParcelFileDescriptor,但没有采用一个公共方法。这是从一开始就存在于ParcelFileDescriptor 中的功能,但直到今天仍然隐藏。 Android 充满了这种废话。

以上是关于有没有办法回退到静态布局中的 Typeface.SERIF?的主要内容,如果未能解决你的问题,请参考以下文章

如果可能,尝试对字符串进行静态断言,或者在不是时回退到运行时检查

Activiti如何实现流程的回退

git回退到某个版本后发现最近提交的都不见了(解决方法)

javascript 如何实现点击按钮让它回退到前一页面。具体怎么实现。在线等。

Angular 应用如何回退到之前曾经浏览过的页面

git中的版本回退