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

1.在代码里面。

[java] view plaincopy
  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 plaincopy
  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 plaincopy
  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.csdn.net/sytzz/archive/2010/06/16/5673662.aspx

 

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

 

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

 

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

 

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

 

 

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

 

 

 

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

 

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

更多相关文章

  1. Android(安卓)Edittext 清空按钮功能的实现
  2. Android(安卓)通过网络图片路径查看图片实例详解
  3. Android实现图片叠加效果的两种方法
  4. Android之Gallery和ImageSwitcher结合的用法
  5. QT on Android(安卓)开机动画和开机图片显示
  6. Matisse Android(安卓)图片选择器
  7. 【Android(安卓)开发教程】GridView
  8. Android(安卓)ToggleButton
  9. android listview 异步加载图片并防止错位及解决ListView滚动后

随机推荐

  1. How to install Android SDK and play wi
  2. Android横竖屏切换时,不重新onCreate()的
  3. Android Studio V0.2.x For Windows下载
  4. android短信发送
  5. Hostapd Android
  6. android 拍照 Camera类 使用照相机进行拍
  7. Android 代码设置EditText过滤汉字
  8. Android 屏幕滑动事件
  9. android setAudioSource failed
  10. android ndk native_activity.h