Android Tint的簡單使用

Android Tint的簡單使用

如果要實現下圖效果,第一時間想到的是讓 UI 切圖,第二時間想到的是自己會被 UI 打死,第三時間想到的是自己會被命名累死。
![屏幕快照 2016-10-13 下午9.58.26](http://odsdowehg.bkt.clouddn.com/屏幕快照 2016-10-13 下午9.58.26.png)

那么,這該如何快速高效的實現呢? 其實 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));

具體的點擊效果這里就不展示了,大家可以去嘗試一下。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容