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方法对图片进行颜色偏移过滤处理。