做游戏经常遇到这个情况,一张图片,从完全透明,渐渐过渡到不透明显示出来。
常规的处理方式是:获得该图象的ARGB颜色数组,每次绘制调整颜色信息。这种方法需要把处理的内容绘制到一张缓冲图象上,再获得该图象的颜色信息,每次循环再逐像素处理。比较繁琐。
下面介绍用android封装的滤镜实现半透明过渡效果,先介绍一下颜色矩阵:???????????????????????????????
????????????? |a b c d e ?|???????????|R|
??????? A = |f ?g h ?i? j |???? ? C=|G|
??????? ????? |k l m n o? |?????????? |B|
???????? ???? |p q? r s t ?|???????????|A|
???????????????????????????????????????? ??|1|?
?????????? |R'|
?????????? |G'|
???? R'= |B'|=A*C
?????????? |A'|??
???????????
矩阵A即为颜色矩阵,每行分别表示R、G、B、A通道。每列表示R、G、B、A分量,最后一列是整体偏移。
矩阵C是原来的颜色信息,最终颜色R‘=A*C,运算方式如下:
?????????? R'=a*R+b*G+c*B+d*A+e
?????????? G'=f*R+g*G+h*B+i*A+j
?????????? B'=k*R+l*G+m*B+n*A+o
?????????? A'=p*R+q*G+r*B+s*A+t
?
OK,我们用代码来示例,如何把图象的透明度调为原来的一半:
??????? //颜色矩阵数据(4*5)
??????? float[] array = new float[] {
??????????????? 1, 0, 0, 0, 0,
??????????????? 0, 1, 0, 0, 0,
??????????????? 0, 0, 1, 0, 0,
??????????????? 0, 0, 0,?0.5f, 0 };
??????? ColorMatrix colorMatrix = new ColorMatrix(array);
??????? Paint paint = new Paint();
??????? paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
??????? g.drawBitmap(img, 0, 0, paint);
?大功告成!其实利用颜色过滤可以实现很多效果,比如转灰度、高光、调整饱和度等等。另外,这个方法对效率有一定的影响,注意优化。