Android字体资源和字体文件(API 26)的区别

6
为了在Android应用程序中使用自定义字体,似乎有两种方法:
  1. 传统方式:将TTF或OTF文件放置在/assets/fonts目录中,然后使用Typeface.createFromAsset(getAssets(), "fonts/custom.ttf")创建Typeface
  2. 自API 26以来的本地方式,或者自API 16以来的AppCompat方式:通过在res/font文件夹中放置小写的TTF/OTF文件并直接在XML布局中引用它们android:fontFamily="@font/custom",或者使用ResourcesCompat.getFont(this, R.font.custom)在程序中访问它们来创建XML字体族
请记住字体资源和资产之间的关键区别是什么?特别是它们是否以相同的方式呈现,哪个性能更快或更高效?
可以认为字体资源仅适用于预先打包在APK中的字体,而字体资产更加灵活,因为您可以从APK内外的任意文件创建Typeface吗?
更新:经过一些实验,看起来字体资源是在AppWidget TextView中设置自定义字体的唯一方法,而不必手动将其绘制为位图,但这需要设备实际运行API 26(在此特定情况下使用支持库无法帮助)。

字体资源从API 26开始本地支持,或者在所有版本的Android上通过AppCompat的帮助得到支持。这就是AppCompat的目的 - 让新功能能够在旧设备上运行。你从哪里得到了这个“除了XML字体资源只从API 26向上支持并需要AppCompat依赖项”的说法? - Eugen Pechanec
1
@EugenPechanec: 是的,我的措辞有些混淆;感谢您指出了问题,并已修复。 - ccpizza
在使用支持库时,要在XML布局文件中正确加载字体,必须使用app命名空间:app:fontFamily="@font/custom"。来源:https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml#using-support-lib - Domenico
1个回答

7
具体来说,它们是否以相同的方式呈现,并且在性能方面哪个更快或更有效率?

ResourcesCompat.getFont 的工作原理如下:
  1. 检查内存缓存是否已将字体资源 ID 解析为 Typeface。如果有命中,则完成。
  2. 将资源复制到磁盘文件中。
  3. 使用 Typerface.createFromFile 从文件创建 Typeface 并缓存它。

对于打包在 APK 中的字体,这是正确的。我不会谈论可下载字体的工作方式。您可以在文档或源探索。

这两种方法的工作方式相同。它们都从源创建一个Typeface对象。
一个关键的区别是:如果您直接使用Typeface API,则需要负责缓存。您不希望多次加载同一字体,因为每个Typeface实例会占用大量内存。
历史上,我使用来自Calligraphy的此代码来处理从资产加载字体时的缓存。

经过一些实验,看起来字体资源是在AppWidget TextViews中设置自定义字体的唯一方法[...]

看起来你是对的。通知和小部件(使用RemoteViews的任何内容)只能使用本地可用的资源和视图属性。
另请参阅:如何在小部件中使用自定义字体?

那么,建议使用字体“资源”而不是字体“资产”?@eugen-pechanec - mochadwi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接