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

Android字体资产与字体资源(API 26),android,fonts,android-appcompat,Android,Fonts,Android Appcompat,为了在android应用程序中使用自定义字体,似乎有两种方法: 经典方式:将TTF或OTF文件放置在/assets/fonts目录中,然后使用构建一个 从API 26开始本机使用,或从API 16开始使用AppCompat使用:将小写TTF/OTF文件放置在res/font文件夹中,然后使用android:fontFamily=“@font/custom”在XML布局中直接引用它们,或使用 字体资源和资产之间需要记住的关键区别是什么 具体地说,它们是以相同的方式呈现的吗?它们中有哪一个在性能方面

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

  • 经典方式:将TTF或OTF文件放置在
    /assets/fonts
    目录中,然后使用构建一个
  • 从API 26开始本机使用,或从API 16开始使用AppCompat使用:将小写TTF/OTF文件放置在
    res/font
    文件夹中,然后使用
    android:fontFamily=“@font/custom”
    在XML布局中直接引用它们,或使用
  • 字体资源和资产之间需要记住的关键区别是什么

    具体地说,它们是以相同的方式呈现的吗?它们中有哪一个在性能方面更快或更高效

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

    更新: 经过一点实验,字体资源似乎是在AppWidget
    TextView
    s中设置自定义字体的唯一方法,无需手动将其绘制为位图,但这需要设备实际运行API 26(在这种特定情况下,使用支持库没有帮助)

    具体地说,它们是以相同的方式呈现的吗?它们中有哪一个在性能方面更快或更高效

    ResourcesCompat.getFont
    的工作原理如下:

  • 如果我们已经将字体资源ID解析为
    字体
    ,请检查内存缓存。如果我们成功了,我们就完蛋了
  • 将资源复制到磁盘文件
  • 使用
    Typerface.createFromFile
    从文件中创建
    Typeface
    ,并将其缓存
  • 这对于APK中捆绑的字体是正确的。我不会讨论可下载字体是如何工作的。你可以去探索,也可以去探索

    两种方法的工作原理相同。它们从一个源创建一个
    字体
    对象

    一个关键的区别是:如果您直接使用
    Typeface
    API,那么您需要负责缓存。
    您不想多次加载同一字体,因为每个
    Typeface
    实例都会占用大量内存

    从历史上看,当从资产加载字体时,我一直在使用缓存

    经过一点实验,字体资源似乎是在AppWidget文本视图中设置自定义字体的唯一方法[…]

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


    另请参见:

    字体资源在API 26本机或在AppCompat的帮助下在所有版本的Android上都受支持。这就是AppCompat的要点——让新东西能够在旧设备上运行。除了API 26以上版本支持的XML字体资源*和*需要AppCompat依赖项,您从哪里得到这个
    ?@EugenPechanec:是的,我的措辞令人困惑;感谢您发现它,已修复。使用支持库时,要在XML布局文件中正确加载字体,您必须使用应用程序名称空间:app:fontfalism=“@font/custom”。来源:因此,建议使用font
    resource
    而不是font
    assets
    @尤金·佩切内克