Android中实现“按下”效果 的方法 (代码、xml)

原文地址:http://blog.csdn.net/xipiaoyouzi/article/details/8028478

使用Button的时候,实现“按下”的效果是很重要的,也是很常见的,主要有下面三种方式: 
第1、2种方式需要按下时和抬起时 两种图片,第3种方式通过改变颜色矩阵,从而改变图像的亮度,对比度,饱和度和色相等。 
(1)用java代码实现 
Java代码 


imageButton.setOnTouchListener(new OnTouchListener(){     
                        @Override     
                        public boolean onTouch(View v, MotionEvent event) {     
                                if(event.getAction() == MotionEvent.ACTION_DOWN){     
                                        //更改为按下时的背景图片     
                                        v.setBackgroundResource(R.drawable.pressed);     
                                }else if(event.getAction() == MotionEvent.ACTION_UP){     
                                        //改为抬起时的图片     
                                        v.setBackgroundResource(R.drawable.released);     
                                }     
                                return false;     
                        }     
              });     


(2)用xml配置文件实现,xml内容如下 
Xml代码 


<?xml version="1.0" encoding="UTF-8"?>     
<selector xmlns:android="[url=http://schemas.android.com/apk/res/android]http://schemas.android.com/apk/res/android[/url]">     
<item           android:state_pressed="false"  android:drawable="@drawable/released " />     
<item           android:state_pressed="true"   android:drawable="@drawable/pressed" />     
<item           android:state_focused="true"    android:drawable="@drawable/pressed" />     
item           android:drawable="@drawable/released " />     
</selector>   


把上面的xml文件,命名为button_regist.xml放在drawable目录下,使用的方法如下: 
Xml代码 


<ImageButton     
android:id="@+id/imageButton"     
android:layout_width="wrap_content"     
android:layout_height="wrap_content"     
android:background="#00000000"     
android:src="@drawable/button_regist " >     
</ImageButton> 


(3)以上两种方式比较简单,但是需要很多的图片和布局文件,如果项目中的图片按钮比较多,那就很浪费资源。第三种方式使用矩阵颜色滤镜。 
颜色过滤矩阵是一个4x5的矩阵,四行分别是红色通道值,绿色通道值,蓝色通道值和alpha通道值。五列分别是对应通道的红色值,绿色值,蓝色值,alpha值和偏移量。 
RGB和Alpha的终值计算方法如下: 
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通道值。 
每个通道的源值和终值都在0到255的范围内。即使计算结果大于255或小于0,值都将被限制在0到255的范围内。 
实现代码如下: 
Java代码 
/


**   
    * 按钮被按下   
    */ 
private final static float[] BUTTON_PRESSED = new float[] {       
    2.0f, 0, 0, 0, -50,       
       0, 2.0f, 0, 0, -50,       
       0, 0, 2.0f, 0, -50,       
       0, 0, 0, 5, 0 };     
         
   /**   
    * 按钮恢复原状   
    */     
private final static float[] BUTTON_RELEASED = new float[] {       
       1, 0, 0, 0, 0,       
       0, 1, 0, 0, 0,       
       0, 0, 1, 0, 0,       
       0, 0, 0, 1, 0 };   

private static final OnTouchListener touchListener = new OnTouchListener() { 
   
  @Override 
  public boolean onTouch(View v, MotionEvent event) { 
   if(event.getAction() == MotionEvent.ACTION_DOWN) { 
    v.getBackground().setColorFilter(new ColorMatrixColorFilter(BUTTON_PRESSED)); 
    v.setBackgroundDrawable(v.getBackground()); 
   }else if(event.getAction() == MotionEvent.ACTION_UP) { 
    v.getBackground().setColorFilter(new ColorMatrixColorFilter(BUTTON_RELEASED)); 
    v.setBackgroundDrawable(v.getBackground()); 
   } 
   return false; 
  } 
}; 
public static void setButtonStateChangeListener(View v) { 
  v.setOnTouchListener(touchListener); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值