本文会带来什么
- android tint 是什么鬼?
- tint 可用来做什么?
- 例子:selector 的另一种实现方式
- 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() 方法
参考
- Drawable 着色的后向兼容方案
- 谈谈Android Material Design 中的Tint(着色)
- 浅谈 Android L 的 Tint(着色)
- Android-使用tint一张图制作selector