Android Studio现在在21+上支持矢量资产,并将在编译时为低版本生成png。我有一个矢量资产(来自材质图标),我想改变填充颜色。这适用于21+,但生成的png不改变颜色。有办法做到这一点吗?
<vector android:height="48dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/primary" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
更新:AppCompat支持
其他答案怀疑android:tint将只在21+设备上工作,AppCompat(v23.2.0及以上)现在提供了向后兼容的tint属性处理。
因此,行动的过程将是使用AppCompatImageView和app:srcCompat(在AppCompat命名空间)而不是android:src(android命名空间)。
下面是一个例子(AndroidX: This is AndroidX .appcompat.widget. appcompatimageview;)):
<android.support.v7.widget.AppCompatImageView
android:id="@+id/credits_material_icon"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginBottom="8dp"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:scaleType="fitCenter"
android:tint="#ffd2ee"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:srcCompat="@drawable/ic_dollar_coin_stack" />
别忘了在gradle中启用向量可绘制支持:
vectorDrawables.useSupportLibrary = true
这是由Filipe绘制的Kotlin版本的Helper
class DrawableHelper(var mContext: Context) {
@ColorRes
private var mColor = 0
private lateinit var mDrawable: Drawable
private lateinit var mWrappedDrawable: Drawable
fun withDrawable(@DrawableRes drawableRes: Int): DrawableHelper {
mDrawable = getDrawable(mContext, drawableRes)!!
return this
}
fun withDrawable(drawable: Drawable): DrawableHelper {
mDrawable = drawable
return this
}
@SuppressLint("ResourceType")
fun withColor(@ColorRes colorRes: Int): DrawableHelper {
mColor = ContextCompat.getColor(mContext, colorRes)
return this
}
@SuppressLint("ResourceAsColor")
fun tint(): DrawableHelper {
mWrappedDrawable = DrawableCompat.wrap(mWrappedDrawable)
DrawableCompat.setTint(mWrappedDrawable, mColor)
DrawableCompat.setTintMode(mWrappedDrawable, PorterDuff.Mode.SRC_IN)
return this
}
fun applyToBackground(view: View) {
view.background = mWrappedDrawable
}
fun applyTo(imageView: ImageView) {
imageView.setImageDrawable(mWrappedDrawable)
}
fun applyTo(menuItem: MenuItem) {
menuItem.icon = mWrappedDrawable
}
fun get(): Drawable {
return mWrappedDrawable
}
companion object {
fun withContext(context: Context): DrawableHelper {
return DrawableHelper(context)
}
}
}