Android点击效果大都使用背景图片的多种状态实现,所以有时候一个ImageView如果比较大的话,而且有点击事件。比如淘宝这样的应用,首页有很多图片的连接,
这样的图片点击一般不太好用背景添加点击效果,如果点到图片直接跳转到下一个页面又会显得很生硬。这时候像iphone那样点击效果覆盖在原始图片上层就会好很多,
思考了一下,只需要重写ImageView,然后重写onDraw方法,在点击的时候添加一层透明的颜色即可。
代码分享给大家:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
public class CustomizeImageView extends ImageView {
// 画笔
private Paint mPaint;
// 当前矩阵
private Rect mRect = new Rect();
public CustomizeImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// 设置可点击,否则不会响应touch的up事件
setClickable(true);
initPaint();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
// 设置效果矩阵的位置,如果ImageView有padding需要去掉padding
mRect.set(0 + getPaddingLeft(), 0 + getPaddingTop()
, right - getPaddingRight(), bottom - getPaddingBottom());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 按下时修改画笔的颜色值,可以自己设置颜色
// 此处设置点击效果的颜色 0x80表示50%透明,如果不设置透明会遮挡图片
mPaint.setARGB(0x80, 61, 64, 91);
invalidate();
break;
case MotionEvent.ACTION_UP:
// 监听到up事件后需要将画笔颜色值清除
mPaint.setARGB(0, 0, 0, 0);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
default:
break;
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 画点击效果
canvas.drawRect(mRect, mPaint);
}
private void initPaint(){
mPaint = new Paint();
// 初始化画笔,如果不把画笔的alpha值设为0,同样会挡住资源图片
mPaint.setAlpha(0);
}
}
这样使用就可以与系统的ImageView一样可以在xml中配置。
注意在给ImageView添加src图片的时候,图片最好把透明边框去掉(美工切图的时候就切掉),效果会更好
tips:请使用utf-8编码
未点击效果图:
点击时效果图: