不久前,矢量图素材被添加到支持库中,自那时起API发生了许多变化:Gradle标志,初始化块,选择器,自定义XML属性等。问题是-现在如何正确地在以下情况下(支持lib v25)使用它:
- ImageView
- TextView drawable
- 菜单图标
- 通知图标
可以通过XML和编程方式进行操作。
不久前,矢量图素材被添加到支持库中,自那时起API发生了许多变化:Gradle标志,初始化块,选择器,自定义XML属性等。问题是-现在如何正确地在以下情况下(支持lib v25)使用它:
可以通过XML和编程方式进行操作。
build.gradle
依赖项中:compile 'com.android.support:appcompat-v7:26.0.2'
android {
...
defaultConfig {
...
vectorDrawables.useSupportLibrary = true
}
...
}
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));
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格式的图片 :(
您需要在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
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />
AppCompatResources.getDrawable
运行良好,谢谢。有人能告诉我为什么ContextCompat.getDrawable
在使用相同的代码并使用矢量图时会出错吗? - casolorz