专栏名称: Android_开发者
目录
相关文章推荐
51好读  ›  专栏  ›  Android_开发者

[译] 在 Android 应用中使用矢量资源

Android_开发者  · 掘金  · android  · 2019-04-30 09:06

正文

阅读 14

[译] 在 Android 应用中使用矢量资源

Illustration by [Virginia Poltrack](https://twitter.com/VPoltrack)

在之前的文章中,我们研究了 Android 的 VectorDrawable 图像格式以及它能够实现的功能:

在这篇文章中,我们将会深入研究如何在你的 app 中应用这些矢量资源。 VectorDrawable 是在 Lollipop(API 21)中引入的,也可以在 AndroidX 中使用(作为 VectorDrawableCompat ),可以向下兼容到 API 14(这使其可以覆盖超过 99% 的设备 )。本文将概述一些能真正在你的应用中使用 VectorDrawables 的建议。

首先是 AndroidX

从 Lollipop 开始,你可以在任何需要使用其他可绘制类型的地方使用 VectorDrawables (使用标准的 @drawable/foo 语法引用它们),但是我建议 始终 使用 AndroidX 实现。

这会显著增加其使用平台的范围,不仅如此,它还支持将特性和 bug 修复程序向后移植到旧平台。例如,使用 AndroidX 中的 VectorDrawableCompat 可以:

  • nonZero evenOdd 路径 fillTypes —— 定义形状“内部” 的两种常见方法,通常用于 SVGs( evenOdd 在 API 24 中得以实现)
  • 渐变(Gradient)& ColorStateList 填充 / 画笔(在 API 24 中被添加实现)
  • Bug修复

事实上,AndroidX 将使用 compat 实现,甚至在一些存在本地实现的平台上( 当前是 api 21-23 )也可以实现上述优点。否则,它将委托给平台实现,因此仍然可以接收对新版本的任何改进(例如,为了提高性能, VectorDrawable 在 API 24 的 C 中重新实现)。

基于这些原因,你应该 始终 使用 AndroidX,即使你很幸运地将你的 minSdkVersion 设置成 24。这没什么不好的,如果/当 VectorDrawable 在未来扩展了新的功能,并且它们也被添加到 AndroidX 中,那么它们就可以直接使用,而不需要重新检查代码。

Alex Lockwood 是这么说的

怎么使用?

为了使用 AndroidX 矢量支持(AndroidX vector support),你需要做 2 件事情:

1. 开启支持

您需要在应用的 build.gradle 中选择加入 AndroidX 矢量支持:

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}
复制代码

如果 minSdkVersion < 21,这意味着 Android Gradle 插件无法 生成矢量资源的 PNG 版本 —— 如果我们使用 AndroidX 库的话就不用担心这个问题。

通过默认的 AAPT (Android 资产包装工具)版本资源。它也被传递给构建工具链。这意味着,如果你在 res/drawable/ 中声明一个 VectorDrawable ,它会为你将其自动移动到 res/drawable-v21/ ,因为系统知道这就是 VectorDrawable 类被引入的时候。

这可以防止属性 ID 冲突 —— 在 VectorDrawables 中使用的属性( android:pathData android:fillColor 等)都有一个整数 ID,这些 ID 是在 API 21 中添加的。在老版本的 Android 上,没有任何东西可以阻止 OEM 使用任何"无人认领”的 ID,因此在较老的平台上使用较新的属性是不安全的。

这种版本控制将阻止在较老的平台上访问这些资源,使反编译成为不可能的事情 —— gradle 标志禁用了可绘制对象资源(vector drawables)的版本控制。这就是为什么你使用 android:pathData 引入你的向量而不是必须切换到 app:pathData 等其他后移功能。

2. 使用 AndroidX 加载

当加载 drawables 时,你需要使用 AndroidX 的方法,因为它已经提供了对矢量资源的支持。这个的切入点是始终利用 AppCompatResources.getDrawable 加载 drawables。虽然有许多方法可以加载 drawables(因为某些原因),但是如果你想使用 compat 向量,就必须使用 AppCompatResources。如果你做不到这一点,那么你就不能连接到 AndroidX 代码路径,当你尝试使用任何你运行的平台不支持的功能时,你的应用程序可能会崩溃。

VectorDrawableCompat 还提供了一个 create 方法。 我总是会建议使用 AppCompatResources ,因为这会增加一层缓存。

如果你想以声明的方式设置 drawables(即在你的布局中), appcompat 提供了一些 Compat 属性,你应该使用这些属性而不是标准的平台属性:

ImageView ImageButton

  • 不要使用: android:src
  • 应该使用: app:srcCompat

CheckBox RadioButton

  • 不要使用: android:button
  • 应该使用: app:buttonCompat

TextView as of appcompat:1.1.0 ):

  • 不要使用: android:drawableStart android:drawableTop
  • 应该使用: app:drawableStartCompat app:drawableTopCompat

由于这些属性是 appcompat 库的一部分,请确保使用 app: namespace。在内部,这些 AppCompat 视图使用 AppCompatResources 来支持加载矢量的加载。







请到「今天看啥」查看全文