如何正确使用向后兼容的Vector Drawable与最新的Android支持库?

Vector drawable已经在不久前添加到支持库中了,自那时起API中有很多变化:Gradle标志,初始化块,选择器,自定义XML属性等。问题是 – 如何正确使用它(在这些情况下支持lib v25):

  • ImageView的
  • TextView drawable
  • 菜单图标
  • 通知图标

XML和编程。

将最新的支持lib添加到应用程序的build.gradle依赖项:

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

并在同一文件中添加以下行:

 android { ... defaultConfig { ... vectorDrawables.useSupportLibrary = true } ... } 

通过矢量资产工作室导入矢量图像。

就是这样,你准备好了!


ImageView的

XML

使用app:srcCompat属性而不是android:src

  

编程

直接来自资源ID:

 imageView.setImageResource(R.drawable.your_drawable); 

设置为Drawable对象(例如,用于着色):

 Drawable vectorDrawable = AppCompatResources.getDrawable(context, R.drawable.your_vector); imageView.setImageDrawable(vectorDrawable); 

如果你想设置色调:

 DrawableCompat.setTint (vectorDrawable, ContextCompat.getColor(context, R.color.your_color)); 

TextView drawable

XML

没有简单的解决方案:XML属性android:drawableTop(Bottom etc)无法处理前Lollipop上的矢量图像。 一种解决方案是将初始化块添加到活动并将向量包装到另一个XML drawable中 。 第二 – 定义自定义TextView 。

编程

直接设置资源不起作用,您必须使用Drawable对象。 以与ImageView相同的方式获取它并使用适当的方法设置它:

 textView.setCompoundDrawablesWithIntrinsicBounds(vectorDrawable, null, null, null); 

菜单图标

没有什么特别的:

  menuItem.setIcon(R.drawable.your_vector); 

声明:

这是不可能的 ,你必须使用PNG 🙁

您需要将vectorDrawables.useSupportLibrary = true添加到build.gradle文件中:

 // Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

您会注意到这个新属性仅存在于Gradle插件的2.0版本中。 如果您使用的是Gradle 1.5,则可以使用:

 // Gradle Plugin 1.5 android { defaultConfig { generatedDensities = [] } // This is handled for you by the 2.0+ Gradle Plugin aaptOptions { additionalParameters "--no-version-vectors" } } 

您需要将srcCompat添加到ImageView: