要求:android项目中做一个默认图片变暗,有焦点时变亮的效果。

解决方案:经典的解决方案,一种是使用xml,一种是写在代码里。
  1.使用选择器selector
 

eg:
     <?xml version="1.0" encoding="utf-8"?>        <item android:state_pressed="true" android:drawable="@drawable/index7_6"></item>
       <item android:state_pressed="false" android:drawable="@drawable/index7_7"></item>
       <item android:drawable="@drawable/index7_7"></item>
     </selector>

    引用:android:backgroud="@drawable/button_selector"
  2.如果在代码中设置
    可以根据ontouch的down事件和up事件来设置对应的图片
   eg:

@Override
  public boolean onTouch(View v, MotionEvent event) {
   // TODO Auto-generated method stub
                 //设置图片控件
   ImageButton ib=(ImageButton) v;
   if (event.getAction() == MotionEvent.ACTION_DOWN) {
    // 更改为按下时控件设置图片
    ib.setImageDrawable(R.drawable.focused);
   } else if (event.getAction() == MotionEvent.ACTION_UP) {
    // 改为抬起时清除滤镜
    ib.setImageDrawable(R.drawable.normal);
   }
   return false;
  }


   3.使用滤镜
    eg:

@Override
  public boolean onTouch(View v, MotionEvent event) {
   // TODO Auto-generated method stub
                 //设置图片控件
   ImageButton ib=(ImageButton) v;
                 //获取图片
   Drawable drawable=(Drawable) ib.getDrawable();
                 //定义效果
   PorterDuff pduff=new PorterDuff();
   if (event.getAction() == MotionEvent.ACTION_DOWN) {
    // 更改为按下时让图片设置滤镜
    drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);
                         //控件设置图片
    ib.setImageDrawable(drawable);
   } else if (event.getAction() == MotionEvent.ACTION_UP) {
    // 改为抬起时清除滤镜
    drawable.clearColorFilter();
   }
   return false;
  }

    注:PorterDuff类
       PorterDuff:
         从上面我们可以看到PorterDuff.Mode为枚举类,一共有16个枚举值:
          1.PorterDuff.Mode.CLEAR 
            所绘制不会提交到画布上。
          2.PorterDuff.Mode.SRC
            显示上层绘制图片
          3.PorterDuff.Mode.DST
            显示下层绘制图片
          4.PorterDuff.Mode.SRC_OVER
            正常绘制显示,上下层绘制叠盖。
          5.PorterDuff.Mode.DST_OVER
            上下层都显示。下层居上显示。
          6.PorterDuff.Mode.SRC_IN
            取两层绘制交集。显示上层。
          7.PorterDuff.Mode.DST_IN
            取两层绘制交集。显示下层。
          8.PorterDuff.Mode.SRC_OUT
            取上层绘制非交集部分。
          9.PorterDuff.Mode.DST_OUT
            取下层绘制非交集部分。
         10.PorterDuff.Mode.SRC_ATOP
            取下层非交集部分与上层交集部分
         11.PorterDuff.Mode.DST_ATOP
            取上层非交集部分与下层交集部分
         12.PorterDuff.Mode.XOR
            异或:去除两图层交集部分
         13.PorterDuff.Mode.DARKEN
            取两图层全部区域,交集部分颜色加深
         14.PorterDuff.Mode.LIGHTEN
            取两图层全部,点亮交集部分颜色
         15.PorterDuff.Mode.MULTIPLY
            取两图层交集部分叠加后颜色
         16.PorterDuff.Mode.SCREEN
            取两图层全部区域,交集部分变为透明色

       4.介绍另一种方法,使ImageButton有按下的特效,只需要准备一张普通的图片,不需要按下效果的图片。

        直接看示例代码,
        ①创建 TouchLight 和 TouchDark 这两个 OnTouchListener,
        ②然后给 ImageButton 设置OnTouchListener就行了,
        ③如果使用TouchLight,则按下效果是按键变亮;另一个就是变暗。

import android.app.Activity; 
 import android.graphics.ColorMatrixColorFilter; 
 import android.view.MotionEvent; 
 import android.view.View; 
 import android.view.View.OnTouchListener; 
   
 public class TouchedAnimation extends Activity { 
       
     public static final OnTouchListener TouchLight = new OnTouchListener() { 
   
         public final float[] BT_SELECTED = new float[] {1,0,0,0,50,0,1,0,0,50,0,0,1,0,50,0,0,0,1,0}; 
         public final 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}; 
   
         @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; 
         } 
     }; 
       
     public static final OnTouchListener TouchDark = new OnTouchListener() { 
           
         public final float[] BT_SELECTED = new float[] {1,0,0,0,-50,0,1,0,0,-50,0,0,1,0,-50,0,0,0,1,0}; 
         public final 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}; 
           
         @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; 
         } 
     }; 
   
         @Override
     public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.main); 
   
         ImageButton ib1, ib2; 
                 ib1 = (ImageButton) findViewById(R.id.ImageButton01); 
                 ib2 = (ImageButton) findViewById(R.id.ImageButton02); 
   
                 ib1.setOnTouchListener(TouchLight); 
                 ib2.setOnTouchListener(TouchDark); 
     } 
 }


   代码里的两个 float 数组里存的东西是颜色矩阵,不了解颜色矩阵也没关系,使用这个附件就行,只需调整亮度、对比度之类的值,然后把生产的颜色矩阵复制到代码里。