先上图
一张图片实现按下变色。(关于松手后不会恢复的问题,设置点击事件就不会有这个问题了)
不得不说iOS在一些比安卓要方便很多,比如自带这个变色的效果。
在网上搜索了一下,比如http://www.cnblogs.com/linjzong/p/4206283.html
用滤镜实现,但是需要拦截触摸事件,然后自己传递点击事件,手指滑动出了view的区域然后抬起手指都会触发点击事件,感觉不太友好。
- 于是有了下面的修改
public class ColorFilterImageView extends AppCompatImageView {
public ColorFilterImageView(Context context) {
super(context);
}
public ColorFilterImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ColorFilterImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//重点在这里,使用dispatchTouchEvent而不是onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
/** 设置滤镜 */
setFilter();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
/** 删除滤镜 */
removeFilter();
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
/**
* 设置滤镜
*/
private void setFilter() {
//先获取设置的src图片
Drawable drawable = getDrawable();
//当src图片为Nul l,获取背景图片
if (drawable == null) {
drawable = getBackground();
}
if (drawable != null) {
//设置滤镜
drawable.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
}
}
/**
* 清除滤镜
*/
private void removeFilter() {
//先获取设置的src图片
Drawable drawable = getDrawable();
//当src图片为Null,获取背景图片
if (drawable == null) {
drawable = getBackground();
}
if (drawable != null) {
//清除滤镜
drawable.clearColorFilter();
}
}
}
重点就是这个了,不拦截触摸事件
//重点在这里,使用dispatchTouchEvent而不是onTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
/** 设置滤镜 */
setFilter();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
/** 删除滤镜 */
removeFilter();
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
好了,很简单就实现了。