Android-Tint變色

Tint變色

作用

tint是Android系統上用於顏色修改的一個功能,讓Android也能有iOS那麼方便的圖片色調轉換,目的是爲了減小apk
的大小,比如我們開發中需要用到的點擊狀態:一般需要兩張圖,一張常態一張點擊態的圖(這裏指的是帶圖片的不能
用點9代替的圖片),通過tint我們可以用一張圖做出多種背景狀態

效果:

這裏寫圖片描述

  • 原圖圖片資源

    img

我們這裏只用了這一張圖片資源開始我們的實現過程

定義方法

首先我們先封裝一個修改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新開闢內存存儲起來,變成一個新的圖片資源和原始圖片分開!

    demo

多狀態tint修改方案

實際使用中我們通常需要給一個控件設置多個狀態,比如返回按鈕這樣的功能,同樣我們的tint也具有這樣的能力

  • 創建資源文件夾color

    demo

  • 創建一個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)));
  • 效果:

這裏寫圖片描述

GitHub傳送門-源碼地址**戳我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章