有没有办法回退到静态布局中的 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 框架,通常没有任何充分的理由。例如,有一个公共方法创建了一个复制FileDescriptor
的ParcelFileDescriptor
,但没有采用一个公共方法。这是从一开始就存在于ParcelFileDescriptor
中的功能,但直到今天仍然隐藏。 Android 充满了这种废话。以上是关于有没有办法回退到静态布局中的 Typeface.SERIF?的主要内容,如果未能解决你的问题,请参考以下文章
如果可能,尝试对字符串进行静态断言,或者在不是时回退到运行时检查