Android Tint的簡單使用
如果要實現下圖效果,第一時間想到的是讓 UI 切圖,第二時間想到的是自己會被 UI 打死,第三時間想到的是自己會被命名累死。

那么,這該如何快速高效的實現呢? 其實 Android 已經替我們想好了,那就是 Android Tint。Tint 意為著色器,即給圖片上色。這樣做的好處就是,你不需要再做一張圖片,在 APK 包中最占大小的就是圖片了,使用 Tint 可以大大減小包大小。
上圖只是在 GridView 中展示 ImageView ,隨機生成顏色給原始圖片 ic_android_black_24dp
著色而已,資源圖片下載自 Android Meterial Icons。
這里我們使用 support-v4
包中的 DrawableCompat
來實現著色,核心代碼如下:
/**
* 給 drawable 著色
*
* @param drawable 需要著色的 drawable 對象
* @param colors ColorStateList 對象,代表需要著色的顏色
* @return
*/
public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) {
//這里需要對 drawable 對象執行 mutate() 操作
//該操作能防止一個屏幕里多次使用同一個圖片,對其中一個圖片操作時影響其他圖片
//當然,你也可以在getResource().getDrawable()的時候就執行
final Drawable wrappedDrawable = DrawableCompat.wrap(drawable.mutate());
DrawableCompat.setTintList(wrappedDrawable, colors);
return wrappedDrawable;
}
注1:如果使用項目中自帶的 ic_launcher.png
使用著色器會使部分細節消失,具體原因不明,留待研究。
注2:ImageView 的 adjustBounds 屬性的應用場景有待研究。
如果要實現圖片的按壓,或者選中效果,同樣可以使用 tint 來實現。只需要定義一個 selector.xml 即可
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/colorAccent" android:state_pressed="true" />
<item android:drawable="@color/colorPrimary" />
</selector>
ImageView image = (ImageView) findViewById(R.id.iv);
Drawable drawable = getResource().getDrawable(R.mipmap.ic_android_black_24dp);
ColorStateList colors = ColorStateList.valueOf(R.drawable.selector);
image.setBackgroundDrawable(tintDrawable(drawable,colors));
具體的點擊效果這里就不展示了,大家可以去嘗試一下。