安卓控件之Button与ImageButton详解以及其按下效果的实现


   Android系统控件Button是一种按钮控件,用户能够在该控件上点击,并后引发相应的事件处理方法;ImageButton用以实现能够显示图像功能的控件按钮。

 button的使用十分简单,button的相关属性如:styleandroid:text android:gravity android:layout_weight也无需赘述了。

 需要注意一下使用java代码引入资源的时候一般利用setImageResource()方法,将新加入的资源文件如:R.drawable.download传递给ImageButton。也就是说设置ImageButton的图片可通过android:src属性,也可以通过setImageResource(int)方法来实现。需要特别注意的是在ImageButton中,如果使用XML配置文件来设置图片的效果的话,就不要再指定它的android:src=""属性值了,否则图片的按下效果就出不来了。

另外,添加点击事件的监听器是实现一个按钮基本功能的基础,当然实现起来也比较简单:

 

button.setOnClickListener(newView.OnClickListener() {
        public void onClick(View view) {
            textView.setText("Button按钮");
        }
    });
    imageButton.setOnClickListener(newView.OnClickListener() {
        public void onClick(View view) {
            textView.setText("ImageButton按钮");
        }
    });


    通过上面的Demo就能很简单的给按钮添加点击事件的监听了。

 在本段代码中,第1行代码中button对象通过调用setOnClickListener()方法,注册一个点击(Click)事件的监听器View.OnClickListener()。

第2行代码是点击事件的回调方法。

第3行代码将TextView的显示内容更改为“Button按钮”。

这里我们来了解一下View.OnClickListener()

View.OnClickListener()是View定义的点击事件的监听器接口,并在接口中仅定义了onClick()方法。当Button从Android界面框架中接收到事件后,首先检查这个事件是否是点击事件,如果是点击事件,同时Button又注册了监听器,则会调用该监听器中的onClick()方法。每个View仅可以注册一个点击事件的监听器,如果使用setOnClickListener()方法注册第二个点击事件的监听器,之前注册的监听器将被自动注销。

还有一种情况,如果需要多个按钮注册到同一个点击事件的监听器上,可以这样:

Button.OnClickListener buttonListener = new Button.OnClickListener(){
        @Override
            public void onClick(View v) {
                switch(v.getId()){
                    case R.id.Button01:
                    textView.setText("Button按钮");
                    return;
                    case R.id.ImageButton01:
                    textView.setText("ImageButton按钮");
                    return;
                }	
        }};
        Button.setOnClickListener(buttonListener);
        ImageButton.setOnClickListener(buttonListener);

   该段代码中,第1行至第12行代码定义了一个名为buttonListener的点击事件监听器;第13行代码将该监听器注册到Button上;第14行代码将该监听器注册到ImageButton上。

说完这些还有一个重要的问题:

跟Button按钮的区别是可以在Imagebutton上加载一个图片。从ImageButton这个字面意思上来看,它是一个图片按钮,那么我们就可以使用它做一个我们想要的图片按钮了,但是我们在实际使用的过程当中,就会发现该按钮的使用并没有想像中的那么简单,需要再增加一些代码或再配置XML才能实现图片按钮按下的效果。

这就得说说自定义button背景和selector的使用了

使用Button的时候,实现“按下”的效果是很重要的,也是很常见的,

这里就常常需要我们使用selector了,不过还有另外几种方式。

总结起来主要有下面三种方式:

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文件实现:(selector)

<span style="font-size:14px;"><?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/button_add" />  
    <item           android:state_pressed="true"   android:drawable="@drawable/button_add_pressed" />  
    <item           android:state_focused="true"    android:drawable="@drawable/button_add_pressed" />  
<item           android:drawable="@drawable/button_add" />  
</selector>  </span><span style="font-size:18px;">

</span>

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

<span style="font-size:14px;"><ImageButton      
	 android:id="@+id/imageButton"      
	 android:layout_width="wrap_content"      
	 android:layout_height="wrap_content"      
	 android:background="#00000000"      
	 android:src="@drawable/button_regist " >      
    </ImageButton>   
</span>

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

颜色过滤矩阵是一个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的范围内

代码如下:

以下内容来自:http://blog.csdn.net/sytzz/archive/2010/06/16/5673662.aspx

/**  
   * 按下这个按钮进行的颜色过滤  
   */  
  public final static float[] BT_SELECTED=new float[] {    
      2, 0, 0, 0, 2,    
      0, 2, 0, 0, 2,    
      0, 0, 2, 0, 2,    
      0, 0, 0, 1, 0 };   
     
  /**  
   * 按钮恢复原状的颜色过滤  
   */  
  public final static float[] BT_NOT_SELECTED=new float[] {    
      1, 0, 0, 0, 0,    
      0, 1, 0, 0, 0,    
      0, 0, 1, 0, 0,    
      0, 0, 0, 1, 0 };   
     
  /**  
   * 按钮焦点改变  
   */  
  public final static OnFocusChangeListener buttonOnFocusChangeListener=new OnFocusChangeListener() {   
     
  @Override  
  public void onFocusChange(View v, boolean hasFocus) {   
   if (hasFocus) {   
    v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));   
    v.setBackgroundDrawable(v.getBackground());   
   }   
   else  
   {   
    v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));   
     v.setBackgroundDrawable(v.getBackground());   
   }   
  }   
 };   
    
  /**  
   * 按钮触碰按下效果  
   */  
 public final static OnTouchListener buttonOnTouchListener=new OnTouchListener() {   
  @Override  
  public boolean onTouch(View v, MotionEvent event) {   
   if(event.getAction() == MotionEvent.ACTION_DOWN){   
    v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));   
    v.setBackgroundDrawable(v.getBackground());   
    }   
    else if(event.getAction() == MotionEvent.ACTION_UP){   
     v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));   
     v.setBackgroundDrawable(v.getBackground());   
    }   
   return false;   
  }   
 };   
    
 /**  
  * 设置图片按钮获取焦点改变状态  
  * @param inImageButton  
  */  
 public final static void setButtonFocusChanged(View inView)   
 {   
  inView.setOnTouchListener(buttonOnTouchListener);   
  inView.setOnFocusChangeListener(buttonOnFocusChangeListener);   
 }  

使用时,调用方法

public final static void setButtonFocusChanged(View inView)

即可。

 

【原理】

 

利用Drawable类的setColorFilter方法对图片进行颜色偏移过滤处理。




 


上一篇:增强MyEclipse提示功能


下一篇:Android Manifest.xml文件解析