VectorDrawable-棒棒糖之前的Android版本是否可以使用?[关闭]


87

背景

我注意到,Android现在通过称为“ VectorDrawable ”的类(以及AnimatedVectorDrawable,BTW)支持某种矢量绘图。我通过查看Android-Studio的新功能找到了它。

我不知道这是否会是具有把多个文件分成多个文件夹(年底mdpihdpixhdpi,等)。那会很棒,并且在某些情况下可能会最小化应用程序的大小。

问题

我想问一些关于这门新课的问题:

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

  2. 我不熟悉它的工作方式,但是Lollipop可以处理SVG文件吗?它可以执行SVG文件上可以实现的任何操作吗?

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


3
据我所知,VectorDrawable是SVG文件的机器人化。不过,我通过使用第三方库来使用SVG已有一年多了。(android-svgsvg-android等)。有类似的名字。每个都有别,因此,请根据您的需要进行准确选择。
Phantômaxx

7
我已经制作了将SVG转换为xml资源向量的在线工具(仅棒棒糖)-inloop.github.io/svg2android-在早期的alpha版本中还没有进行太多测试。它支持简单的svg文件(如android支持),我已经用inkscape测试了它-绘制了一些形状(矩形,圆形,螺旋形...),然后选择所有“路径->路径对象”,导出到* .svg放到站点中,生成xml并正常工作。
Yuraj 2014年

1
@Yuraj哇,太酷了!做得好 !在这么短的时间内...在这里,带我的+1。:)
android开发人员

关于inloop.github.io/svg2android ...s a very usefull tool but I在这种情况下结果不正确,我不知道出什么问题了...嗯,要进一步发布,我希望这个工具会通知格式错误...如果我使用带有3个方库的纯svg文件,一切都很好...
Alex Zezekalo 2015年

@AlexZezekalo您应该在其Github页面上写它:github.com/inloop/svg2android
android开发人员

Answers:


39

2016年3月更新

通过Android支持库23.2.1更新,支持矢量可绘制对象和动画矢量可绘制对象。(您也可以使用latestone)

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

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

向量可绘制对象允许您XML中定义的单个向量图形替换多个png资产虽然以前仅限于棒棒堂及更高版本的设备,都VectorDrawableAnimatedVectorDrawable现在可通过两种新的支持库支持向量绘制动画矢量抽拉。app:srcCompat参考向量drawables的新属性。

github上查看源代码并提供一些示例示例

v7 appcompat库的更改:

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


3
关于向量支持,仅更新gradle插件并在“ defaultConfig”中使用“ vectorDrawables.useSupportLibrary = true”还不够吗?
Android开发者

1
是的,对于Gradle插件2.0+Gradle插件1.5,您需要添加-> android {defaultConfig {generateDensities = []} // //由2.0+ Gradle插件为您处理aaptOptions {AdditionalParameters“ --no-version -vectors“}}
Amit Vaghela

1
另外,请在此处显示一些代码。某天某个链接可能会失效。您将为此付出+1 :)
android开发者

是肯定的。将在短时间内在git和此处发布代码。
阿米特·瓦格拉

2
compile上面的陈述暗示该项目使用RecyclerView的情况并非总是如此。
令人眼花

13

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

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

检查此23.4.0现在可用

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


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

第一步骤是磕碰的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"  
   }  
}

第三,参考链接的答案


是的,我看到了。感谢您提供的扩展信息。我认为对于系统范围的东西(通知,小部件等),这当然是不可用的
android开发者

确定它应该工作。从那时起,它基本上是引用可绘制对象的。你试过了吗?此处的示例将可绘制的向量设置为MenuItem,效果很好。
2016年

您确定它甚至可以用于通知和小部件吗?我说的是使其在旧的Android版本上运行。他们该如何处理向量?他们不能使用支持库,不是吗?
Android开发者

使用支持库版本的全部目的是使事情在较旧的版本中起作用。作为记录,它的作品全部回的方式API 7和API 11动画矢量绘图资源
razzledazzle

再次,这在应用程序内部有效,但是如果您尝试在外部使用它们(如在通知和小部件上),该怎么办?我认为它不会在那儿工作,因为我认为您不能让其他应用程序(启动器)使用支持库,更不用说通知栏了。你试过了吗?
Android开发者

12

您可以尝试此支持库。它支持Lollipop中引入的VectorDrawable和AnimatedVectorDrawable,并且具有向后完全兼容的功能。


该库仅与API级别14及更高版本兼容,而Mr Vector库最低兼容7+版本。
donturner 2015年

@donturner:我同意你的观点,但是我不认为开发人员仍在为7 API开发应用程序。
V_J 2015年

4
也许不是API 7,但绝对不是API 10(姜饼),因为它占Android市场(developer.android.com/about/dashboards/index.html)的4.1%。
donturner 2015年

8

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

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

VectorDrawable备忘单


确实,但是我认为,如果允许它自动生成png文件,那么它应该是安全的
Android开发人员

1
用精确的方式解释。
Abhijit Kurane

这应该是公认的答案。谢谢。
贾斯汀·迈纳斯

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);

希望这可以帮助。


1
几天前已不赞成使用MrVector,而推荐使用即将成为支持库的一部分的VectorDrawableCompat。
WindRider 2015年

太棒了。谢谢(你的)信息。
gnuanu

是的,我等不及用一些胖屁股的SVG来启动我的应用程序了:D
WindRider 2015年

1
不推荐使用。请改用此stackoverflow.com/a/30502261/1954675
V_J 2015年

3

如果您使用的是VectorDrawable,则Android Studio会自动为Lollipop之前的版本生成相应的PNG文件(基于XML文件)。

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

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


是的,它是最近出版的。但是,它使用的是PNG,而不是矢量,因此,如果我更改保存图像的imageView的大小,它将被像素化/模糊化。
Android开发人员

@android开发人员:您部分正确。会发生这种现象,但VectorDrawables会是相同的。每个VectorDrawable具有在其XML(例如vector_drawable.xml)中定义的宽度和高度。如果此宽度/高度设置为50x50dp,但您将ImageView大小设置为100x100dp,则即使您运行的是Android 5.0,结果仍将是模糊的(因此使用的是VectorDrawable而不是自动生成的BitmapDrawable)。与常见的位图相比,VectorDrawable的真正好处是可以解决屏幕dpi的问题,因此即使在4k显示器上也不会模糊。
Mehlyfication 2015年

您是说使用未设置的大小时VectorDrawable不能很好地显示吗?但这是向量化的内容。。。
Android开发人员

它也会为Animated Vector Drawables生成PNG吗?
路易CAD

不,它不会为这种情况创建PNG。如果要在运行Android 5.0之前版本的Android 5.0的设备上设置矢量可绘制动画,则可能需要尝试VectorDrawableCompat:developer.android.com/reference/android/support/graphics/…–
Mehlyfication

3

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

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

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

SVG到VectorDrawable转换器是SVG图像到Android VectorDrawable XML资源文件的批处理转换器。在线版

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


2

目前,支持库中没有VectorDrawable。

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


因此,只有当Lollipop变得足够流行时,这才有意义,即使那样,它也不会提供很多功能。:(
Android开发人员

您知道新的矢量API的任何教程/示例/视频吗?
Android开发人员


1

好消息是Google发布了Android支持库23.2支持矢量可绘制对象和动画矢量可绘制对象!

但是,感谢那些在Google之前移植此库的人!

这是AppCompat库的绝佳地方,它们可以将Android的许多新功能带回到更早的版本。借助新实现的VectorDrawable类,开发人员现在可以一直使用矢量图像,直至API 7(Android 2.1 Eclair)。动画矢量的局限性更大,可追溯到API 11(Android 3.0 Honeycomb),但目前仍包含超过97%的活跃使用的设备

使用指南:

请参阅年龄的最载体由@chrisbanes


1
真好!您能否分享一些有关如何使用新的支持库的vectors API的示例/教程?
Android开发人员

当然可以!已经将其添加到我的周末待办事项列表中!:)
LOG_TAG '16

1
谢谢。如果很短,也请在这里写。
Android开发者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.