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

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

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


 

时间: 2024-12-02 11:00:47

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

WinForm控件开发总结(六) 控件属性类型转换器代码详解

在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器, 现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义. 要实现一个类型转换器,我们必须要重写(override)四个方法: CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我 们只提供转换string和InstanceDescriptor类型的能力. CanConvertTo()――根据类型参数进行测试,判断是否能从当前类型转换成指定的类型. C

Android控件之ListView用法实例详解_Android

本文实例讲述了Android控件之ListView用法.分享给大家供大家参考.具体如下: 示例一: 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示. main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" androi

分析10个ASP.NET控件最有用的属性详解_实用技巧

1.ClientIDMode 渲染ASP.NET控件时会自动生成一个ID,当我们在客户端脚本中引用它们时,却会制造不少麻烦,虽然它是命名容器和ID的简单串联,但仍然无法预测生成的ID范围. ASP.NET 4.0使用ClientIDMode属性解决了这个问题,它允许你控制生成这些ID的方法,ClientIDMode有四个可选择的值:AutoID,Static,Predictable和Inherit.下面是这四个值的含义解释: AutoID – 和4.0以前的版本保持一致,自动生成ID. Stat

Android开发中使用WebView控件浏览网页的方法详解

本文实例讲述了Android开发中使用WebView控件浏览网页的方法.分享给大家供大家参考,具体如下: 项目中遇到数学展示问题,常规的Textview显示处理不了数学公式,利用图片生成对服务器又产生较大压力,经过查询,可以通过webview加载JS实现.IOS同样的方法也可实现,但JS渲染效率远高于安卓.对Webview做下总结. 1.WebView 在使用WebView控件时,首先需要在xml布局文件中定义一个WebView控件,定义的方法如下: <WebView android:id=&quo

艾伟:WinForm控件开发总结(六)-----控件属性类型转换器代码详解

      在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器,现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义.       要实现一个类型转换器,我们必须要重写(override)四个方法:       CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDescriptor类型的能力.       CanConvertTo()――根据类型参数进行测试

Android控件之ListView用法实例详解

本文实例讲述了Android控件之ListView用法.分享给大家供大家参考.具体如下: 示例一: 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示. main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" androi

对象-安卓控件和持有者模式,出现空指针异常

问题描述 安卓控件和持有者模式,出现空指针异常 错误提示空指针异常,本人看了好几遍没找到,望大神们指点 public class MainActivity extends Activity { List list=new ArrayList(); ListView lv=null; EditText et=null; Button btn=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCr

控件显示-安卓控件如何设置在屏幕上的位置

问题描述 安卓控件如何设置在屏幕上的位置 请问一下安卓控件如何在java代码中设置控件在屏幕上的位置,不使用XML

控件-求助:button点击事件无法触发

问题描述 求助:button点击事件无法触发 前台是这样的 已选择: </ul> <asp:Button ID="btn_update_app" runat="server" Text="确定" onclick="btn_confirm_Click" /> <input id="Button3" type="button" value="取消&qu