按钮的点击变换颜色还有另外的方法!

以上两种方式比较简单,但是需要很多的图片和布局文件,如果项目中的图片按钮比较多,那就很浪费资源。第三种方式使用矩阵颜色滤镜。

颜色过滤矩阵是一个4x5的矩阵, 四行分别是 红色通道值,绿色通道值,蓝色通道值和alpha通道值。五列分别是 对应通道的红色值,绿色值,蓝色值,alpha值和偏移量。

RGBAlpha的终值计算方法如下:

Red通道终值 = a[0] * srcR + a[1] * srcG + a[2] * srcB + a[3] * srcA + a[4]

Green通道终值 = a[5] * srcR + a[6] * srcG + a[7] * srcB + a[8] * srcA + a[9]

Blue通道终值 = a[10] * srcR + a[11] * srcG + a[12] * srcB + a[13] * srcA + a[14]

Alpha通道终值 = a[15] * srcR + a[16] * srcG + a[17] * srcB + a[18] * srcA + a[19]

备注:

srcR为原图Red通道值,srcG为原图Green通道值,srcB为原图Blue通道值,srcA为原图Alpha通道值。

每个通道的源值和终值都在0255的范围内。即使计算结果大于255或小于0,值都将被限制在0255的范围内。

实现代码如下:

 

Java代码   收藏代码
  1. /**    
  2.        * 按钮被按下   
  3.        */  
  4. private final static float[] BUTTON_PRESSED = new float[] {        
  5.           2.0f, 000, -50,        
  6.           02.0f, 00, -50,        
  7.           002.0f, 0, -50,        
  8.           00050 };       
  9.              
  10.       /**    
  11.        * 按钮恢复原状    
  12.        */      
  13. private final static float[] BUTTON_RELEASED = new float[] {        
  14.           10000,        
  15.           01000,        
  16.           00100,        
  17.           00010 };    
  18.    
  19. private static final OnTouchListener touchListener = new OnTouchListener() {  
  20.           
  21.         @Override  
  22.         public boolean onTouch(View v, MotionEvent event) {  
  23.             if(event.getAction() == MotionEvent.ACTION_DOWN) {  
  24.                 v.getBackground().setColorFilter(new ColorMatrixColorFilter(BUTTON_PRESSED));  
  25.                 v.setBackgroundDrawable(v.getBackground());  
  26.             }else if(event.getAction() == MotionEvent.ACTION_UP) {  
  27.                 v.getBackground().setColorFilter(new ColorMatrixColorFilter(BUTTON_RELEASED));  
  28.                 v.setBackgroundDrawable(v.getBackground());  
  29.             }  
  30.             return false;  
  31.         }  
  32.     };  
  33.   
  34. public static void setButtonStateChangeListener(View v) {  
  35.         v.setOnTouchListener(touchListener);  
  36.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值