欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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