Tint 着色器讲解「原创」


本文会带来什么

  1. android tint 是什么鬼?
  2. tint 可用来做什么?
  3. 例子:selector 的另一种实现方式
  4. tint原理

android tint 是什么鬼?

tint 翻译为 着色器

tint 可用来做什么?

可以为drawable 着色,满足以下需求
1.图片没换,就换了颜色,用tint省了一张图片
2.设置整体色调

例子:selector 的另一种实现方式

我们试着用tint ,以及一张图片设置按钮的normal态和按下态

方式1

用xml布局来做(5.0 以上有效

/res/drawable/tint_selector.xml

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/tint_pressed" ></item>
<item android:drawable="@drawable/tint_normal" ></item>
</selector>

其中 tint_normal 为一张png图片,tint_pressed为以tint_normal.png为基础的xml drawable 文件,其内容如下

/res/drawable/tint_pressed.xml

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/tint_normal"
android:tint="@color/tint_pressed"
android:tintMode="multiply">
</bitmap>

讲解:其中 以 tint_normal 为基础图片,以 color/tint_pressed 颜色为 图片作色,最后 ImageView 正常引用即可

方式2

用java 代码(完美兼容5.0以下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 用 tint 设置 按下颜色切换
*
* @param imageView
*/

public void setTintDrawable(ImageView imageView) {
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.tint_normal);
int[] colors = new int[]{ContextCompat.getColor(this, R.color.tint_pressed),
ContextCompat.getColor(this, R.color.tint_normal)};
int[][] states = new int[2][];
states[0] = new int[]{android.R.attr.state_pressed};
states[1] = new int[]{};
ColorStateList colorList = new ColorStateList(states, colors);
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(states[0], drawable);//注意顺序
stateListDrawable.addState(states[1], drawable);
Drawable.ConstantState state = stateListDrawable.getConstantState();
drawable = DrawableCompat.wrap(state == null ? stateListDrawable : state.newDrawable()).mutate();
DrawableCompat.setTintList(drawable, colorList);
imageView.setImageDrawable(drawable);
}

讲解:以代码的方式为ImageView 设置 tint着色后的图片

tint 原理

最终调用了 Drawable 的 setColorFilter() 方法


参考

  1. Drawable 着色的后向兼容方案
  2. 谈谈Android Material Design 中的Tint(着色)
  3. 浅谈 Android L 的 Tint(着色)
  4. Android-使用tint一张图制作selector