要求:android项目中做一个默认图片变暗,有焦点时变亮的效果。
解决方案:经典的解决方案,一种是使用xml,一种是写在代码里。
1.使用选择器selector
eg:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<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 数组里存的东西是颜色矩阵,不了解颜色矩阵也没关系,使用这个附件就行,只需调整亮度、对比度之类的值,然后把生产的颜色矩阵复制到代码里。
http://www.cnblogs.com/xiaowenji/archive/2011/02/04/1949165.html