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

时间:2016-11-18 13:58:55

标签: java android android-appcompat android-vectordrawable

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

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

XML并以编程方式。

2 个答案:

答案 0 :(得分:31)

将最新的支持库添加到您应用的build.gradle依赖项:

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

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

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

通过Vector Asset Studio导入矢量图像。

就是这样,你准备好了!

ImageView的

<强> XML

使用app:srcCompat属性代替android:src

<ImageView
    ...
    app:srcCompat="@drawable/your_vector" 
    ... />

<强>编程

直接来自资源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上的矢量图像。一个解决方案是add initializer block to activity and wrap vector into another XML drawable。第二 - to define a custom TextView

<强>编程

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

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

菜单图标

没有什么特别的:

<item
    ...
    android:icon="@drawable/your_vector"
    ... />

menuItem.setIcon(R.drawable.your_vector);

通知:

这是impossible,您必须使用PNG :(

答案 1 :(得分:-1)

您需要将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:

<ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" />