如何正确地使用向后兼容的矢量图形与最新的Android支持库?

6

不久前,矢量图素材被添加到支持库中,自那时起API发生了许多变化:Gradle标志,初始化块,选择器,自定义XML属性等。问题是-现在如何正确地在以下情况下(支持lib v25)使用它:

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

可以通过XML和编程方式进行操作。

2个回答

32
将最新的支持库添加到您的应用程序的build.gradle依赖项中:
compile 'com.android.support:appcompat-v7:26.0.2'

在同一文件中添加以下行:
android {
    ...
    defaultConfig {
        ...
        vectorDrawables.useSupportLibrary = true
    }
    ...
}

通过矢量资产工作室导入矢量图像。 < p > 就这些,你已经准备好了!


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

没有简单的解决方案:在Lollipop之前,XML属性android:drawableTop(Bottom等)无法处理矢量图像。一种解决方案是添加初始化块到活动并将矢量图像包装到另一个XML可绘制对象中。第二个解决方案是定义自定义TextView

编程方式

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

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

菜单图标

没有什么特别的:

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

menuItem.setIcon(R.drawable.your_vector);

通知:

这很不可能,你必须使用PNG格式的图片 :(


2
1+ 对于两种情况。 - Harshad Pansuriya
AppCompatResources.getDrawable 运行良好,谢谢。有人能告诉我为什么 ContextCompat.getDrawable 在使用相同的代码并使用矢量图时会出错吗? - casolorz

-1

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

// 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"  
  }  
 }  

你需要在ImageView中添加srcCompat属性:
<ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" /> 

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