Android ImageButton自定义按钮的按下效果的代码实现方法分享
程序员文章站
2023-11-08 14:43:46
使用button时为了让用户有“按下”的效果,有两种实现方式:1.在代码里面。
复制代码 代码如下:imagebutton.setontouchlistener(new...
使用button时为了让用户有“按下”的效果,有两种实现方式:
1.在代码里面。
复制代码 代码如下:
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 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>
这个文件放在drawable目录下面。命名为button_add_x.xml
使用的时候
复制代码 代码如下:
<imagebutton
android:id="@+id/imagebutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00000000"
android:src="@drawable/button_add_x" >
</imagebutton>
我自己摸索摸索,发现这样的实现过程虽然通用性好,但是很麻烦,一个按钮实现效果需要多张图片甚至再加一个布局…
那一个游戏要是有几百个按钮怎么办呢?
于是:以下代码被酝酿出来了:
复制代码 代码如下:
/**
* 按下这个按钮进行的颜色过滤
*/
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方法对图片进行颜色偏移过滤处理。