Android字体资产与字体资源(API 26)

时间:2019-02-09 14:26:36

标签: android fonts android-appcompat

为了在android应用中使用自定义字体,似乎有两种方法:

  1. 经典方式:将TTF或OTF文件放置在/assets/fonts目录中,然后使用Typeface构建Typeface.createFromAsset(getAssets(), "fonts/custom.ttf")
  2. 从API 26开始或从API 16开始使用AppCompat create an XML font family,方法是将小写的TTF / OTF文件放在res/font文件夹中,然后直接在XML布局中使用android:fontFamily="@font/custom",或使用ResourcesCompat.getFont(this, R.font.custom)以编程方式访问它们。

字体资源和资产之间要记住的主要区别是什么?

具体来说,它们是否以相同的方式呈现,并且它们中的任何一个在性能方面都更快或更有效吗?

是否可以假定字体资源仅适用于预包装在APK中的字体,而字体资产更灵活,因为可以从APK内部或外部的任意文件创建字样?

更新: 经过一些试验,看起来字体资源是在AppWidget TextView中设置自定义字体的唯一方法,而无需手动将其绘制为位图,但这需要设备实际运行API 26(使用支持库在这种情况下无济于事)。

1 个答案:

答案 0 :(得分:0)

  

具体来说,它们是否以相同的方式呈现,并且它们中的任何一个在性能方面都更快或更有效吗?

ResourcesCompat.getFont的工作方式如下:

  1. 检查内存缓存是否已将字体资源ID解析为Typeface。如果我们成功了,那就完成了。
  2. 将资源复制到磁盘文件。
  3. 使用Typeface从文件创建Typerface.createFromFile并将其缓存。

对于APK中捆绑的字体来说确实如此。我不会研究可下载字体的工作方式。您可以浏览该in the docsin the source

两种方法的工作原理相同。他们从源头创建一个Typeface对象。

一个主要区别:如果您直接使用Typeface API,则负责缓存。您不想多次加载相同的字体,因为每个{{ 1}}实例占用大量内存。

从历史上看,我从资产加载字体时使用this code from Calligraphy进行缓存。

  

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

看起来您是对的。通知和小部件(任何使用RemoteViews的东西)只能使用视图上的本机可用资源和属性。

另请参阅:How to use a custom typeface in a widget?