众所周知,矢量图可以作为一个drawable文件设置到ImageView里面,但是我常常会碰到同一个矢量图,路径的颜色却老是变化情况,一怒之下写出来这个控件~~
同一个矢量图的文件,设置颜色后:
1.在values下的attrs.xml文件中创建自定义的属性
XML
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="vectorImageView">
<attr name="vectorPathColor" format="color|reference" />
</declare-styleable>
</resources>
2.创建自定义控件文件 VectorImageView.kt
Kotlin
import android.content.Context
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.graphics.drawable.DrawableCompat
class VectorImageView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {
var iconColor: Int = 0
set(value) {
field = value
if (iconColor != 0) {
applyIconColor(value)
}
}
init {
// 初始化时读取自定义属性
attrs?.let {
val typedArray = context.obtainStyledAttributes(it, R.styleable.vectorImageView)
// 使用 getColor 获取颜色,默认值为 0
iconColor = typedArray.getColor(R.styleable.vectorImageView_vectorPathColor, 0)
typedArray.recycle()
}
}
// 根据颜色值应用到 ImageView 的矢量图上
private fun applyIconColor(color: Int) {
val drawable: Drawable? = drawable
drawable?.let {
val wrappedDrawable = DrawableCompat.wrap(it).mutate()
DrawableCompat.setTint(wrappedDrawable, color)
setImageDrawable(wrappedDrawable)
}
}
3.使用
XML
<包名.VectorImageView
android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60"
android:src="@drawable/left_arrow"
app:vectorPathColor="@color/color_A0A5A6" />
<!-- app:vectorPathColor="#FF921D"-->