- 原文地址: Using vector assets in Android apps
- 原文作者: Nick Butcher
- 译文出自: 掘金翻译计划
- 本文永久链接: github.com/xitu/gold-m…
- 译者: YueYong
- 校对者: Rickon , TUARAN
在之前的文章中,我们研究了 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
来支持加载矢量的加载。