88

背景

我注意到 Android 现在通过一个名为“ VectorDrawable ”的类(以及AnimatedVectorDrawable,顺便说一句)支持某种矢量绘图。我通过查看Android-Studio上的新功能发现了它。

我想知道这是否是不得不将多个文件放入多个文件夹(mdpi、、、hdpixhdpi)的结束。这会很棒,并且在某些情况下可能会最小化应用程序的大小。

问题

关于这个新课程,我想问几个问题:

  1. 是否可以在较旧的 Android 版本中使用它,甚至可以通过谷歌支持库的库?

  2. 我不熟悉它是如何工作的,但是 Lollipop 可以处理 SVG 文件吗?它可以做任何可以在 SVG 文件上实现的事情吗?

  3. 除了我找到的文档之外,是否有任何使用它的示例/教程/视频?

4

9 回答 9

39

2016 年 3 月更新

通过Android Support Library 23.2.1更新,支持 Vector Drawables 和 Animated Vector Drawables。(您也可以使用 latestone)

请更新 gradle 文件中的库版本。

compile 'com.android.support:recyclerview-v7:23.2.1'

Vector drawables 允许您用XML 中定义的单个矢量图形替换多个 png 资源。虽然以前仅限于 Lollipop 和更高版本的设备,但现在两者VectorDrawableAnimatedVectorDrawable可以通过两个新的支持库support-vector-drawableanimated-vector-drawable 获得。app:srcCompat引用矢量可绘制对象的新属性。

使用一些示例检查github上的源代码。

v7 appcompat 库的更改:

恢复了对矢量资产的依赖,因此使用 appcompat 库的开发人员不会被迫使用VectorDrawable及其相关的构建标志。

于 2016-03-02T04:47:48.273 回答
14

更新 2:他们在支持库 23.4.0 中再次启用它:

对于 AppCompat 用户,我们添加了一个可选 API,以通过 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) 从资源中重新启用对 Vector Drawables 的支持(在 23.2 中发现的行为) - 请记住,这仍然会导致内存使用问题和更新配置实例时出现问题,因此默认情况下它被禁用。

检查这个23.4.0 现在可用

更新:这不适用于 23.3.0 版本,请查看此处了解详细信息。代理绘图不起作用。app:srcCompatsetImageResource()工作,但是。


Vector Drawable 支持可从版本 23.2 及更高版本的支持库中获得。但是,要正确使用这些可绘制对象,必须间接引用它们。

第一步是升级AppCompat版本。

compile 'com.android.support:appcompat-v7:23.2.0'

其次启用 Vector Drawable 支持。如果使用 Gradle 插件,2.0+

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}

否则

android {  
   defaultConfig {  
     generatedDensities = []  
   }  

   aaptOptions {  
     additionalParameters "--no-version-vectors"  
   }  
}

第三,参考链接答案

于 2016-03-09T17:36:49.827 回答
12

你可以试试这个支持库。它支持 Lollipop 中引入的 VectorDrawable 和 AnimatedVectorDrawable,具有完全向后兼容性。

于 2015-05-28T09:18:14.677 回答
8

为了补充这里的一些答案:是的,您可以获得对 VectorDrawables pre-Lollipop 的支持,至少是部分支持。

有多偏?这取决于 - 我制作了这个图表来提供帮助(对支持库 23.4.0 到 - 至少 - 25.1.0 有效)。

VectorDrawable 备忘单

于 2017-01-25T15:42:35.357 回答
6

不幸的是,此时 VectorDrawable 和 AnimatedVectorDrawable 在支持库中不可用。但是要在 Pre-Lollipop 版本中使用此功能,您可以使用名为 MrVector 的非官方反向移植。

MrVector 在 Github 中可用,它将支持 android 版本 7+。

来自官方自述文件

要添加 MrVector 依赖项,请将以下行添加到您的 build.gradle 依赖项块中。

compile 'com.telly:mrvector:0.2.0'

要从矢量 XML 创建可绘制对象,

Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

希望这可以帮助。

于 2015-01-22T09:02:38.817 回答
3

如果您使用 VectorDrawable,Android Studio 将自动为 Pre-Lollipop 版本生成相应的 PNG 文件(基于您的 XML 文件)。

请注意,在运行 API 低于 21 的设备上,这些生成的 PNG 文件被视为 BitmapDrawables 而不是 VectorDrawables,因此不能在这些设备上进行动画或类似操作。

有关详细信息,请参阅“向后兼容性”: http ://android-developers.blogspot.co.at/2015/09/android-studio-14.html

于 2015-10-21T10:06:19.543 回答
3

Lollipop 无法处理没有第三方库的 SVG 文件。

我找到的最佳解决方案是BetterVectorDrawable库以及SVG to VectorDrawable Converter

BetterVectorDrawable是 Android 4.0+ 的 VectorDrawable 实现,在 Android 5.0+ 上具有可配置的回退行为。

SVG to VectorDrawable Converter是 SVG 图像到 Android VectorDrawable XML 资源文件的批量转换器。网络版

链接指向自述文件,其中提供了有关如何使用 lib 和转换器的足够信息。

于 2015-08-22T21:27:50.480 回答
2

目前支持库中没有 VectorDrawables。

Funkystein 是对的——VectorDrawable 与 SVG 类似,只支持最需要的矢量绘图功能,以便 android 可以专注于性能。例如,pathData 与 SVG 的“d”字符串具有相同的格式。

于 2014-10-24T20:04:04.673 回答
1

好消息是 Google 发布了Android Support Library 23.2 Support Vector Drawables 和 Animated Vector Drawables!

但是感谢在谷歌之前移植这个库的人!

这就是 AppCompat 库的强大之处,它们可以将 Android 的许多新功能带回更早的版本。借助新实现的 VectorDrawable 类,开发人员现在可以一直使用矢量图像,直至 API 7 (Android 2.1 Eclair)。动画矢量的限制有点多,只能追溯到 API 11(Android 3.0 Honeycomb),但它仍然涵盖了当今活跃使用的 97% 以上的设备

使用指南:

请参阅@chrisbanes的向量年龄

于 2016-02-25T06:08:17.100 回答