代码之家  ›  专栏  ›  技术社区  ›  ccpizza

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

  •  -1
  • ccpizza  · 技术社区  · 6 年前

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

    1. 经典方式 :将TTF或OTF文件放入 /assets/fonts 目录,然后生成 Typeface 具有 Typeface.createFromAsset(getAssets(), "fonts/custom.ttf") .
    2. 自API 26起为本机版本,或自API 16起为AppCompat版本 : create an XML font family 通过在 res/font 文件夹,然后直接在XML布局中引用它们 android:fontFamily="@font/custom" 或通过编程访问它们 ResourcesCompat.getFont(this, R.font.custom) .

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

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

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Eugen Pechanec    6 年前

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

    ResourcesCompat.getFont 工作方式如下:

    1. 如果我们已经将字体资源ID解析为 Typeface . 如果我们成功了,我们就完了。
    2. 将资源复制到磁盘文件。
    3. 创造 字体 从文件中使用 Typerface.createFromFile 并缓存它。

    这对于apk中捆绑的字体是正确的。我不想谈可下载字体的工作原理。你可以探索一下 in the docs in the source .

    两种方法的工作原理相同。他们创造了一个 字体 来自源的对象。

    一个关键区别: 如果你直接使用 字体 API,您负责缓存。 您不希望多次加载同一字体,因为 字体 实例占用大量内存。

    历史上,我用 this code from Calligraphy 从资源加载字体时要注意缓存。

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

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

    参见: How to use a custom typeface in a widget?