VectorDrawable - 它是否可用于 Android 5.0 以下版本?

88

背景

我注意到Android现在支持某种类型的矢量图,通过一个名为“VectorDrawable”的类(还有AnimatedVectorDrawable)。我是通过查看 Android-Studio 的新功能了解到的。

我想知道这是否将是不必将多个文件放入多个文件夹中(如mdpihdpixhdpi等)的终结。这将非常好,并且可能会在某些情况下减小应用程序的大小。

问题

关于这个新类,我想问一些问题:

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

  2. 我不熟悉它的工作原理,但Lollipop可以处理SVG文件吗?它能做到SVG文件可以实现的任何功能吗?

  3. 除我发现的文档之外,是否有使用它的示例/教程/视频?


3
据我所见,VectorDrawable 是将 SVG 文件“android化”的过程。不过,我已经使用第三方库(如 android-svgsvg-android 等)来使用 SVG 已经有一年的时间了。还有其他类似名称的库。它们各不相同,因此根据您的需求选择时要精确选择。 - Phantômaxx
7
我已经制作了一个在线工具,将SVG转换为XML资源矢量图(仅适用于Lollipop)- http://inloop.github.io/svg2android/ - 它还没有经过多次测试,仍处于早期阶段。它支持简单的SVG文件(与Android支持的一样),我已经使用Inkscape进行了测试 - 绘制了一些形状(矩形、圆形、螺旋...),然后选择所有内容,点击“路径->对象转路径”,导出为*.svg文件并拖放到网站中,生成XML并且可以正常工作。 - Yuraj
1
@Yuraj 哇,太酷了!做得很好!而且时间这么短...给你一个+1。:) - android developer
我想为SVG添加一个现代的库:Sharp - Paul Lammertsma
Android支持库23.2现在支持从API 7开始的VectorDrawables和从API 11开始的AnimatedVectorDrawables。所以,你的问题的答案现在是肯定的。 - darshanz
显示剩余2条评论
9个回答

39

2016年3月更新

通过Android支持库23.2.1的更新,支持矢量图形和动画矢量图形。(您也可以使用最新版本的支持库)

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

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

矢量图形允许您使用XML定义的单个向量图形替换多个PNG文件,从而简化了素材的管理。虽然以前仅限于Lollipop及更高版本设备,但现在两个新的支持库 support-vector-drawableanimated-vector-drawable 中均可使用VectorDrawableAnimatedVectorDrawable。同时还引入了新的app:srcCompat属性来引用矢量图形。

具有一些实例示例Github源代码检查。

v7 appcompat库的变化:

取消了对矢量素材的依赖,因此使用appcompat库的开发人员不需要强制使用VectorDrawable及其相关构建标志。


3
关于矢量图的支持,是否只需更新Gradle插件并在"defaultConfig"中使用"vectorDrawables.useSupportLibrary = true"即可? - android developer
1
是的,对于Gradle插件2.0+和Gradle插件1.5,您需要添加--> android {
defaultConfig {
generatedDensities = []
} // 这由2.0+ Gradle插件为您处理
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
- Amit Vaghela
1
此外,请在此处展示一些代码。链接可能某天会失效。 你将因此获得+1的积分 :) - android developer
2
上面的compile语句意味着该项目使用RecyclerView,但并非总是如此。 - razzledazzle
我猜这个不能用在小部件和通知上,对吗? - android developer
显示剩余7条评论

14

更新2:他们在Support Library 23.4.0中再次启用了它:

对于AppCompat用户,我们添加了一项选择性API来通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)重新启用来自资源的矢量图形支持(在23.2中找到的行为)- 请记住,这仍然可能会导致内存使用问题和更新配置实例时出现问题,因此默认情况下禁用。

查看此现在可用的23.4.0版本

更新:从版本23.3.0开始,这不起作用。 有关详细信息,请查看此处。 代理可绘制对象不起作用。但是app:srcCompatsetImageResource()有效。


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

第一步是升级AppCompat版本。

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

第二步,启用矢量图支持。 如果使用Gradle插件,则需要2.0+版本。

android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
   }  
}
否则。
android {  
   defaultConfig {  
     generatedDensities = []  
   }  

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

第三点,请参阅链接的答案


是的,我看到了。谢谢你提供的详细信息。对于系统范围的内容(通知、小部件等),当然是不可用的... - android developer
确定它应该可以工作。从那时起,它基本上是引用可绘制对象。你试过了吗?那里的示例将矢量可绘制对象设置为“MenuItem”,这很好地运行。 - razzledazzle
你确定这样可以在通知和插件上运行吗?我是在谈论如何使它在旧版Android上运行。他们如何处理此向量呢?他们不能使用支持库,对吧? - android developer
使用支持库版本的整个目的是使事情在旧版本中正常工作。如文档所述,它可以在API 7及更高版本上运行,并支持从API 11开始的动画矢量可绘制对象。 - razzledazzle
这在应用程序内是有效的,但如果您尝试在通知和小部件上使用它们呢?我认为那里不会起作用,因为我认为您无法使其他应用程序(启动器)使用支持库,更不用说通知栏了。您试过了吗? - android developer
显示剩余2条评论

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

那个库只兼容API 14及以上版本,而Mr Vector库兼容7+版本。 - donturner
@donturner:我同意你的观点,但我认为开发人员不再为7 API开发应用程序了。 - V_J
4
可能不是API 7,但绝对是API 10(Gingerbread),因为它占据了Android市场的4.1%(https://developer.android.com/about/dashboards/index.html)。 - donturner

8

补充一些答案:是的,在Lollipop之前,您可以获得对VectorDrawables的支持,至少是部分支持。

如何部分支持?这取决于情况 - 我制作了this diagram来帮助解释(适用于Support Library 23.4.0至少到25.1.0)。

VectorDrawable cheatsheet


确实,但我认为如果您允许它自动生成PNG文件,那应该是安全的。 - android developer
1
以精确的方式解释。 - Abhijit Kurane
这应该是被接受的答案。谢谢。 - Justin Meiners

6

很遗憾,在这个时候,支持库中没有VectorDrawable和AnimatedVectorDrawable。但是,为了在Lollipop之前的版本中使用此功能,您可以使用名为MrVector的非官方后移版。

MrVector在Github上可用,并且将支持android版本7+。

从官方Readme中

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

compile 'com.telly:mrvector:0.2.0'

从矢量XML创建可绘制对象,
Drawable drawable = MrVector.inflate(getResources(), R.drawable.vector_android);

希望这有所帮助。

1
MrVector已经在几天前被弃用,取而代之的是即将推出的VectorDrawableCompat,它将成为支持库的一部分。 - WindRider
真的很酷。谢谢你提供的信息。 - gnuanu
耶,我迫不及待地想用一些超棒的SVG来打造我的应用程序 :D - WindRider
1
已弃用。请使用此链接 https://dev59.com/ol8d5IYBdhLWcg3wsT0b#30502261。 - V_J

3

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

我找到的最佳解决方案是BetterVectorDrawable库和SVG to VectorDrawable Converter一起使用。

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

SVG to VectorDrawable Converter是将SVG图像批量转换为Android VectorDrawable XML资源文件的转换器。在线版

链接指向readmes,提供了关于如何使用库和转换器的足够信息。


3
如果您使用VectorDrawable,在Android Studio中会自动生成相应的PNG文件(根据您的XML文件)供Pre-Lollipop版本使用。
请注意,这些生成的PNG文件在运行API低于21的设备上被视为BitmapDrawables而不是VectorDrawables,因此无法在这些设备上进行动画或类似操作。
有关更多详细信息,请参见“向后兼容性”: http://android-developers.blogspot.co.at/2015/09/android-studio-14.html

是的,它最近被发布了。然而,它使用的是PNG格式,而不是矢量图,所以如果我改变包含图像的imageView的大小,它会变得像素化/模糊。 - android developer
@Android开发者:你说的部分正确。这种行为确实会发生,但对于VectorDrawables也是如此。每个VectorDrawable在其XML中都定义了宽度和高度(例如vector_drawable.xml)。如果将此宽度/高度设置为50x50dp,但将ImageView大小设置为100x100dp,则即使您正在运行Android 5.0(因此正在使用VectorDrawable而不是自动生成的BitmapDrawable),结果仍将模糊。 与普通位图相比,VectorDrawable的真正好处在于它考虑了屏幕dpi,因此即使在4k显示器上也不会模糊。 - Mehlyfication
你的意思是说,如果没有为VectorDrawable设置大小,它就不能很好地显示?但这是矢量化内容...否则为什么不起作用呢? - android developer
它是否也能为动态矢量图生成PNG文件? - Louis CAD
不,它不会为该情况创建PNG。如果您想在运行Android 5.0之前版本的设备上动画矢量可绘制对象,则可以尝试使用VectorDrawableCompat: https://developer.android.com/reference/android/support/graphics/drawable/AnimatedVectorDrawableCompat.html - Mehlyfication

2

目前支持库中没有可用的VectorDrawables。

Funkystein是正确的——VectorDrawable类似于SVG,只支持需求最高的矢量绘图特性,这样Android可以专注于性能。例如,pathData的格式与SVG的"d"字符串相同。


所以这只有在Lollipop变得足够流行时才会相关,即使那时它也没有提供很多功能。:( - android developer
你知道有没有新的向量API的教程/示例/视频吗? - android developer
2
我现在找到了一个: http://blog.sqisland.com/2014/10/first-look-at-animated-vector-drawable.html#comment-form, https://github.com/chiuki/animated-vector-drawable - android developer

1
伟大的消息是Google发布了Android Support Library 23.2支持矢量图形和动画矢量图形!但要感谢在Google之前移植这个库的人们!引用块中说到,AppCompat库非常好,它们可以将许多新功能带回早期版本。通过新实现的VectorDrawable类,开发人员现在可以使用矢量图像,直到API 7(Android 2.1 Eclair)。动画矢量图形有点更受限制,只能向后兼容到API 11(Android 3.0 Honeycomb),但仍包括今天活跃使用的设备的97%以上。使用指南:请参考@chrisbanes的age-of-the-vectors

1
太好了!你能分享一些关于如何使用新的支持库矢量API的示例/教程吗? - android developer
当然!我已经把它加入到我的周末待办事项清单中了! :) - LOG_TAG
1
谢谢。 - android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接