前言:或许你身边一个不起眼的小人物就是某个领域的超级大神~不要轻易地侮辱任何一个人的错误,因为你也曾范错过
系列文章:
Android自定义控件三部曲文章索引:http://blog.csdn.net/harvic880925/article/details/50995268
上篇给大家讲了在setColorFilter中使用ColorMatrix的过程,其实setColorFilter除了使用ColorMatrix还有其它的用法,这节我们就具体来看看setColorFilter的用法。
在本篇文章中,你将学到两个实例:
- 按钮点击时,动态加深图片色彩(简易方法)
- 可以学到针对不同主题动态设置不同色彩图片的方法(setTint())
一、setColorFilter
setColorFilter的完整声明为:
public ColorFilter setColorFilter(ColorFilter filter)
参数是传入ColorFilter的对象,其实ColorFilter是一个空对象,其中什么也没有:
public class ColorFilter {
int native_instance;
/**
* @hide
*/
public int nativeColorFilter;
protected void finalize() throws Throwable {
try {
super.finalize();
} finally {
finalizer(native_instance, nativeColorFilter);
}
}
private static native void finalizer(int native_instance, int nativeColorFilter);
}
但是ColorFilter派生了几个子类,分别是:
下面我们分别来讲讲各个子类的用法及效果
1、ColorMatrixColorFilter
这个是色彩矩阵颜色过滤器,该类只有两个函数,也都是构造函数:
ColorMatrixColorFilter(ColorMatrix matrix)
ColorMatrixColorFilter(float[] array)
在这里可以直接传入一个ColorMatrix对象,也可以直接传入一个色彩矩阵。我们知道ColorMatrix对应的也是一个色彩矩阵。
上篇中我们在讲解ColorMatrix的用法时,也一直用到的是ColorMatrixColorFilter。
这里在下面看下用法,具体就不再讲了,不理解的同学,请返回去看上一篇
canvas.drawBitmap(bitmap, null, new Rect(0, 0, 500, 500 * bitmap.getHeight() / bitmap.getWidth()), mPaint);
canvas.translate(510, 0);
// 生成色彩矩阵
ColorMatrix colorMatrix = new ColorMatrix(new float[]{
1/2f,1/2f,1/2f,0,0,
1/3f,1/3f,1/3f,0,0,
1/4f,1/4f,1/4f,0,0,
0,0,0,1,0
});
mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
canvas.drawBitmap(bitmap, null, new Rect(0, 0, 500, 500 * bitmap.getHeight() / bitmap.getWidth()), mPaint);
效果图如下:
2、LightingColorFilter
前一篇,我们利用一篇的篇幅来讲解ColorMatrix的作用,所有需要完成色彩操作的都是可以利用ColorMatrix来完成的,只是有一点ColorMatrix纵然很强大,但太!过!难!用,所以Android为我们提供了一个简单过滤颜色和增强色彩的函数,就是LightingColorFilter
这个叫做光照颜色过滤器,可以简单的完成色彩过滤和色彩增强功能。
整个类就只有一个函数,还是构造函数:
public LightingColorFilter(int mul, int add)
这里有两个参数,mul是乘法multiply的缩写,add是加法的意思。mul和add取值都是0xRRGGBB,分别对应R、G、B颜色,注意哦,这里是没有透明度A的,透明度在这里是不起作用的,LightingColorFilter只针对RGB色值起作用
比如,当前有一个颜色值为(r,g,b),对它应用LightingColorFilter(mul, add)效果后的颜色值为:
结果R值 = (r*mul.R+add.R)%255;
结果G值 = (g*mul.G+add.G)%255;
结果B值 = (b*mul.B+add.B)%255;
前面我们讲了mul和add的取值都是0xRRGGBB类型的值,即mul和add中都是包含了R、G、B分量的;
在上面的公式中,三个颜色分量R、G、B值的方式都是一样的,我们只拿红色来讲:
结果R值 = (r*mul.R+add.R)%255;
作用LightingColorFilter(mul, add)效果后的R值