Tint變色
作用
tint是Android系統上用於顏色修改的一個功能,讓Android也能有iOS那麼方便的圖片色調轉換,目的是爲了減小apk
的大小,比如我們開發中需要用到的點擊狀態:一般需要兩張圖,一張常態一張點擊態的圖(這裏指的是帶圖片的不能
用點9代替的圖片),通過tint我們可以用一張圖做出多種背景狀態
效果:
原圖圖片資源
我們這裏只用了這一張圖片資源開始我們的實現過程
定義方法
首先我們先封裝一個修改tint的方法,用於後邊統一的修改
public Drawable tintDrawable(Drawable drawable, ColorStateList color) {
final Drawable tempDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(tempDrawable, color);
return tempDrawable;
}
實現簡單tint修改
img1 = (ImageView) findViewById(R.id.img_normal);
img2 = (ImageButton) findViewById(R.id.img_click);
final Drawable originBitmapDrawable = getResources().getDrawable(R.drawable.electric);
img1.setImageDrawable(tintDrawable(originBitmapDrawable, ColorStateList.valueOf(Color.GREEN)))
- 效果
你會發現原本第一張原圖也跟着一起改了,這是爲什麼呢?其實是因爲tint修改默認是修改原始圖片drawable
的顏色,所以如果一張圖片在多個地方同時使用,會導致一起被改變的效果,注意:如果多次修改只會保持最後一次
修改的顏色指定修改圖片
但是使用時,我們通常是需要指定控件被修改的,這樣我們需要用到Drawable的mutate()
方法,修改上面的代碼
img1 = (ImageView) findViewById(R.id.img_normal);
img2 = (ImageButton) findViewById(R.id.img_click);
final Drawable originBitmapDrawable = getResources().getDrawable(R.drawable.electric).mutate();
img1.setImageDrawable(tintDrawable(originBitmapDrawable, ColorStateList.valueOf(Color.GREEN)))
問題解決了:其實
mutate
方法的作用就是將修改後的drawable新開闢內存存儲起來,變成一個新的圖片資源和原始圖片分開!
多狀態tint修改方案
實際使用中我們通常需要給一個控件設置多個狀態,比如返回按鈕這樣的功能,同樣我們的tint也具有這樣的能力
創建資源文件夾color
創建一個select資源文件
select_click
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#1d16a4" android:state_pressed="true"/>
<item android:color="#f20934" android:state_pressed="false"/>
</selector>
- 代碼中調用
final Drawable originBitmapDrawable2 = getResources().getDrawable(R.drawable.electric).mutate();
img2.setImageDrawable(tintDrawable(originBitmapDrawable2, getResources().getColorStateList(R.color.select_click)));
- 效果: