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

本文介绍两种实现Android ImageButton按下效果的方法,一种通过代码设置不同状态下的背景图片,另一种使用XML文件定义状态选择器。同时提供了一种自定义颜色过滤实现按钮状态变化的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

首先看看网上的 2 种方法:

【以下为引用网络,来源: http://www.eoeandroid.com/thread-7931-1-1.html

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

1. 在代码里面。

  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 文件实现。

  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

使用的时候

  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 >    

 

【以上为引用网络,来源: http://www.eoeandroid.com/thread-7931-1-1.html

 

【以下为原创,转载请注明出处: http://blog.youkuaiyun.com/sytzz/archive/2010/06/16/5673662.aspx

 

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

 

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

 

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

 

  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.  }    
  65. /**  
  66.    * 按下这个按钮进行的颜色过滤  
  67.    */   
  68.   public   final   static   float [] BT_SELECTED= new   float [] {   
  69.       20002 ,   
  70.       02002 ,   
  71.       00202 ,   
  72.       00010  };  
  73.     
  74.   /**  
  75.    * 按钮恢复原状的颜色过滤  
  76.    */   
  77.   public   final   static   float [] BT_NOT_SELECTED= new   float [] {   
  78.       10000 ,   
  79.       01000 ,   
  80.       00100 ,   
  81.       00010  };  
  82.     
  83.   /**  
  84.    * 按钮焦点改变  
  85.    */   
  86.   public   final   static  OnFocusChangeListener buttonOnFocusChangeListener= new  OnFocusChangeListener() {  
  87.     
  88.   @Override   
  89.   public   void  onFocusChange(View v,  boolean  hasFocus) {  
  90.    if  (hasFocus) {  
  91.     v.getBackground().setColorFilter(new  ColorMatrixColorFilter(BT_SELECTED));  
  92.     v.setBackgroundDrawable(v.getBackground());  
  93.    }  
  94.    else   
  95.    {  
  96.     v.getBackground().setColorFilter(new  ColorMatrixColorFilter(BT_NOT_SELECTED));  
  97.      v.setBackgroundDrawable(v.getBackground());  
  98.    }  
  99.   }  
  100.  };  
  101.    
  102.   /**  
  103.    * 按钮触碰按下效果  
  104.    */   
  105.  public   final   static  OnTouchListener buttonOnTouchListener= new  OnTouchListener() {  
  106.   @Override   
  107.   public   boolean  onTouch(View v, MotionEvent event) {  
  108.    if (event.getAction() == MotionEvent.ACTION_DOWN){  
  109.     v.getBackground().setColorFilter(new  ColorMatrixColorFilter(BT_SELECTED));  
  110.     v.setBackgroundDrawable(v.getBackground());  
  111.     }  
  112.     else   if (event.getAction() == MotionEvent.ACTION_UP){  
  113.      v.getBackground().setColorFilter(new  ColorMatrixColorFilter(BT_NOT_SELECTED));  
  114.      v.setBackgroundDrawable(v.getBackground());  
  115.     }  
  116.    return   false ;  
  117.   }  
  118.  };  
  119.    
  120.  /**  
  121.   * 设置图片按钮获取焦点改变状态  
  122.   * @param inImageButton  
  123.   */   
  124.  public   final   static   void  setButtonFocusChanged(View inView)  
  125.  {  
  126.   inView.setOnTouchListener(buttonOnTouchListener);  
  127.   inView.setOnFocusChangeListener(buttonOnFocusChangeListener);  
  128.  }  
   

使用时,调用方法

public final static void setButtonFocusChanged(View inView)

即可。

 

【原理】

 

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

 

 

以下为效果图,登陆按钮此时为获取焦点状态。

 

 

 

代码可以适当修改实现 3 个不同的状态:正常,获取焦点,点击。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值