Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法

使用Button时为了让用户有“按下”的效果,有两种实现方式:

1.在代码里面。

[java]   view plain copy
  1. imageButton.setOnTouchListener(new OnTouchListener(){     
  2.                         @Override    
  3.                         public boolean onTouch(View v, MotionEvent event) {     
  4.                                 if(event.getAction() == MotionEvent.ACTION_DOWN){     
  5.                                         //更改为按下时的背景图片     
  6.                                         v.setBackgroundResource(R.drawable.pressed);     
  7.                                 }else if(event.getAction() == MotionEvent.ACTION_UP){     
  8.                                         //改为抬起时的图片     
  9.                                         v.setBackgroundResource(R.drawable.released);     
  10.                                 }     
  11.                                 return false;     
  12.                         }     
  13.                 });    
  14. imageButton.setOnTouchListener(new OnTouchListener(){  
  15.                         @Override  
  16.                         public boolean onTouch(View v, MotionEvent event) {  
  17.                                 if(event.getAction() == MotionEvent.ACTION_DOWN){  
  18.                                         //更改为按下时的背景图片  
  19.                                         v.setBackgroundResource(R.drawable.pressed);  
  20.                                 }else if(event.getAction() == MotionEvent.ACTION_UP){  
  21.                                         //改为抬起时的图片  
  22.                                         v.setBackgroundResource(R.drawable.released);  
  23.                                 }  
  24.                                 return false;  
  25.                         }   
  26.                 });   

 

2.XML文件实现。

[xhtml]   view plain copy
  1. xml version="1.0" encoding="UTF-8"?>    
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">    
  3.     <item           android:state_pressed="false"  android:drawable="@drawable/button_add" />    
  4.     <item           android:state_pressed="true"   android:drawable="@drawable/button_add_pressed" />    
  5.     <item           android:state_focused="true"    android:drawable="@drawable/button_add_pressed" />    
  6. <item           android:drawable="@drawable/button_add" />    
  7. selector>    
  8.   
  9. xml version="1.0" encoding="UTF-8"?>  
  10. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  11. <item           android:state_pressed="false"  android:drawable="@drawable/button_add" />  
  12.   
  13.     <item            android:state_pressed="true"  android:drawable="@drawable/button_add_pressed" />  
  14.     <item            android:state_focused="true"  android:drawable="@drawable/button_add_pressed" />  
  15.     <item             android:drawable="@drawable/button_add" />  
  16. selector>   

 

这个文件放在drawable目录下面。命名为button_add_x.xml

使用的时候

[xhtml]   view plain copy
  1. <ImageButton    
  2.                         android:id="@+id/ImageButton"    
  3.                         android:layout_width="wrap_content"    
  4.                         android:layout_height="wrap_content"    
  5.                         android:background="#00000000"    
  6.                         android:src="@drawable/button_add_x" >    
  7. ImageButton>    
  8. <ImageButton  
  9.                         android:id="@+id/ImageButton"  
  10.                         android:layout_width="wrap_content"  
  11.                         android:layout_height="wrap_content"  
  12.                         android:background="#00000000"  
  13.                         android:src="@drawable/button_add_x" >  
  14. ImageButton>   

 

我自己摸索摸索,发现这样的实现过程虽然通用性好,但是很麻烦,一个按钮实现效果需要多张图片甚至再加一个布局…

 

那一个游戏要是有几百个按钮怎么办呢?

 

于是:以下代码被酝酿出来了:

 

[java]   view plain copy
  1. /**   
  2.    * 按下这个按钮进行的颜色过滤   
  3.    */    
  4.   public final static float[] BT_SELECTED=new float[] {      
  5.       20002,      
  6.       02002,      
  7.       00202,      
  8.       00010 };     
  9.        
  10.   /**   
  11.    * 按钮恢复原状的颜色过滤   
  12.    */    
  13.   public final static float[] BT_NOT_SELECTED=new float[] {      
  14.       10000,      
  15.       01000,      
  16.       00100,      
  17.       00010 };     
  18.        
  19.   /**   
  20.    * 按钮焦点改变   
  21.    */    
  22.   public final static OnFocusChangeListener buttonOnFocusChangeListener=new OnFocusChangeListener() {     
  23.        
  24.   @Override    
  25.   public void onFocusChange(View v, boolean hasFocus) {     
  26.    if (hasFocus) {     
  27.     v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));     
  28.     v.setBackgroundDrawable(v.getBackground());     
  29.    }     
  30.    else    
  31.    {     
  32.     v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));     
  33.      v.setBackgroundDrawable(v.getBackground());     
  34.    }     
  35.   }     
  36.  };     
  37.       
  38.   /**   
  39.    * 按钮触碰按下效果   
  40.    */    
  41.  public final static OnTouchListener buttonOnTouchListener=new OnTouchListener() {     
  42.   @Override    
  43.   public boolean onTouch(View v, MotionEvent event) {     
  44.    if(event.getAction() == MotionEvent.ACTION_DOWN){     
  45.     v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_SELECTED));     
  46.     v.setBackgroundDrawable(v.getBackground());     
  47.     }     
  48.     else if(event.getAction() == MotionEvent.ACTION_UP){     
  49.      v.getBackground().setColorFilter(new ColorMatrixColorFilter(BT_NOT_SELECTED));     
  50.      v.setBackgroundDrawable(v.getBackground());     
  51.     }     
  52.    return false;     
  53.   }     
  54.  };     
  55.       
  56.  /**   
  57.   * 设置图片按钮获取焦点改变状态   
  58.   * @param inImageButton   
  59.   */    
  60.  public final static void setButtonFocusChanged(View inView)     
  61.  {     
  62.   inView.setOnTouchListener(buttonOnTouchListener);     
  63.   inView.setOnFocusChangeListener(buttonOnFocusChangeListener);     
  64.  }    

 

 

使用时,调用方法

public final static void setButtonFocusChanged(View inView)

即可。

 

【原理】

 

利用Drawable类的setColorFilter方法对图片进行颜色偏移过滤处理。

你可能感兴趣的:(android,android,bt,xhtml,layout,encoding,button)