代码很简单,采用BitmapShader的复制图片机制实现。用法与ImageView相同,可设置模糊度setBlurDegree以及显示半径setRadius
public class TouchImageView extends ImageView {
private float radius = 70;
private float blurDegree=200;
private Paint paint = null;
private Bitmap blurBitmap=null;
private float x;
private float y;
private boolean shouldDrawOpening = false;
public TouchImageView(Context context) {
super(context);
}
public TouchImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setRadius(float radius) {
this.radius = radius;
}
public void setBlurDegree(float blurDegree){
this.blurDegree = blurDegree;
}
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
int action = motionEvent.getAction();
shouldDrawOpening = (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE);
x = motionEvent.getX();
y = motionEvent.getY();
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
if (paint == null || blurBitmap == null) {
//创建与ImageView相同大小的画布
Bitmap original = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas originalCanvas = new Canvas(original);
//第一次,新建canvas,并绘制。但是注意:再第二次调用onDraw方法时,不会绘制并且不会保存。
super.onDraw(originalCanvas);
//根据原始图片创建Shader,画笔将按照原始图片画图。
Shader shader = new BitmapShader(original, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint = new Paint();
paint.setShader(shader);
//创建模糊图片
blurBitmap = blur(original, blurDegree);
}
//将模糊图片绘制在ImageView原始画布上
canvas.drawBitmap(blurBitmap, 0, 0, paint);
if (shouldDrawOpening) {
//根据原始图片以及Shader,画笔按照原始图片画圆
canvas.drawCircle(x, y - radius, radius, paint);
}
}
private Bitmap blur(Bitmap original, float radius) {
Bitmap bitmap = Bitmap.createBitmap(original);
return Blur.fastBlur(bitmap, (int) radius, true);
}
}