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

来源:互联网 发布:单片机做音乐播放器 编辑:程序博客网 时间:2024/05/06 21:40


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

 button的使用十分简单,button的相关属性如:styleandroid:textandroid: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方法对图片进行颜色偏移过滤处理。




 


2 0
原创粉丝点击