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

更多相关文章

  1. Android(安卓)UI之对话框(dialog)
  2. android 5.1拍照后图片镜像处理
  3. Android(安卓)图文数据JSON解析,金山词霸每日一句API的调用
  4. Android(安卓)studio 点击按钮跳转到新的Activity
  5. Android高效加载大图、多图解决方案,有效避免程序OOM
  6. 拖动条SeekBar的简单使用
  7. Android(安卓)与 JS 交互数据上限问题【Refusing to load URL as
  8. 特效--------圆角 倒影
  9. Android(安卓)点击back键两次退出程序

随机推荐

  1. 【译】Kotlin Android扩展(Kotlin Android
  2. 探究Android异步消息的处理之Handler详解
  3. LinearLayout 线性布局管理器
  4. Android Manifest文件
  5. Android教程-Android 五大布局讲解与应用
  6. Android(安卓)Studio编译失败:More than o
  7. Android 慕课学习笔记整理(一)
  8. 转:基于 Android NDK 的学习之旅----- C调
  9. 在service和BroadCastReceiver中 启动act
  10. Mac下Android(安卓)Studio中获取SHA1和MD