Vector Drawables 在 Android 上开箱即用 4+

Vector Drawables work out of the box on Android 4+

我在 XML 的 Android 4+ 上使用矢量绘图并且代码没有任何问题。

设置:Android Gradle 插件 3.2.1,Android Studio 3.2.1,Gradle 4.10.1,android-x 支持库开启 Jetifier。

用法示例:

许多官方或不太官方的博客或堆栈溢出帖子提到用法:

但是我的矢量绘图 运行 没有任何这些都很好。

是否有关于此的官方最终文档?这些标志是必需的吗?

我唯一注意到的是 Android Studio 中的这个警告,我忽略了它:

to use vector drawable compat you need to set defaultConfig.vectorDrawables.useSupportLibrary = true

Vector drawables overview推荐,但没说需要

它还说:

Android Studio 1.4 introduced limited compatibility support for vector drawables by generating PNG files at build time.

不清楚,而且 Release Notes for 1.4 实际上并没有过多提及矢量 Drawable。然而,这似乎是说,当你不告诉 Gradle 你想使用支持库时,它会为每个矢量生成密度相关的 PNG,并且可能在旧设备上使用它们而不是向量。

如果这是真的,那么您确实应该使用支持库。为每个 DPI 生成一个 PNG 会使你的应用程序体积膨胀很多。我很确定支持库会在运行时为不支持矢量的设备生成 PNG,这意味着 APK 保持较小。

没有:

android.defaultConfig.vectorDrawables.useSupportLibrary = true

build.gradle 中,为每个矢量可绘制对象生成 PNG,并成为生成的 .apk 文件的一部分。

打开上面的标志,下面是可能的:

  • app:srcCompat="@drawable/some_vector_drawable" 布局 xml
  • android:icon="@drawable/some_vector_drawable" 在菜单中 xml
  • imageView.setImageResource(R.drawable.some_vector_drawable) 代码

    (但矢量可绘制对象必须是单个矢量(即:以 <vector 开头))

  • 从代码获取 VectorDrawable:

    Drawable vectorDrawable = VectorDrawableCompat.create(resources, R.drawable.some_vector_drawable, null)

    然后可以将其用作常规可绘制对象(例如:imageView.setImageDrawable(vectorDrawable)

两者兼而有之:

android.defaultConfig.vectorDrawables.useSupportLibrary = true

& AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

一起,VectorDrawables 工作起来几乎就像他们在 Android 4+ 上原生一样。 但是,Google 警告说使用 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) 可能会导致内存问题或 Configuration 对象出现问题(我没有遇到任何问题)。