`
zhoujianghai
  • 浏览: 434339 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android中ImageButton实现“按下”效果

阅读更多

 

使用Button的时候,实现“按下”的效果是很重要的,也是很常见的,主要有下面三种方式:

12种方式需要按下时和抬起时 两种图片,第3种方式通过改变颜色矩阵,从而改变图像的亮度,对比度,饱和度和色相等。

1)用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 version="1.0" encoding="UTF-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">    
 <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目录下,使用的方法如下:

 

<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值和偏移量。

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的范围内。

实现代码如下:

 

/**   
	   * 按钮被按下  
	   */
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);
	}
 

 

 

 

 

 

分享到:
评论
1 楼 ghostcynric 2012-02-09  
大哥。。第三种方法,在虚拟机上,为什么第一次按按钮时没有反应,必须要第二次按以后才会出现效果?

相关推荐

Global site tag (gtag.js) - Google Analytics