橡皮擦效果的实现

废话少说,直接贴代码,希望对大家有帮助。


public class DrawView extends View{
private Canvas pcanvas;
private Paint paint;
private Path path;

private Bitmap originBitmap;
private Bitmap pureBitmp;
private Bitmap bitmapBuff;
private float scaleWidth;
private float scaleHeight;
private float downx = 0,downy = 0;

public DrawView(Context context) {
super(context);

setBackgroundResource(R.drawable.pic);
path = new Path();
paint = new Paint();
paint.setAlpha(0);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
paint.setAntiAlias(true);

paint.setDither(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(15.6f);

initLayer(context);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(path, paint);
canvas.drawBitmap(bitmapBuff, 0, 0, null);
}

private void initLayer(Context context){
InputStream stream = context.getResources().openRawResource(R.drawable.layer);
originBitmap = BitmapFactory.decodeStream(stream);
int width = originBitmap.getWidth();
int height = originBitmap.getHeight();

Display currentDisplay = ((Activity)context).getWindowManager().getDefaultDisplay();
float newWidth = currentDisplay.getWidth();
float newHeight = currentDisplay.getHeight();

scaleWidth = ((float) newWidth / width);
scaleHeight = ((float) newHeight / height);

Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);

pureBitmp = Bitmap.createBitmap(originBitmap, 0, 0, width, height,matrix, true);
bitmapBuff = Bitmap.createBitmap(pureBitmp.getWidth(),pureBitmp.getHeight(), Bitmap.Config.ARGB_8888);

pcanvas = new Canvas(bitmapBuff);
pcanvas.drawBitmap(pureBitmp, 0, 0, null);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
path.reset();
path.moveTo(downx, downy);
break;
case MotionEvent.ACTION_MOVE:
float upx = event.getX();
float upy = event.getY();
touchMove(upx, upy);
invalidate();
break;
case MotionEvent.ACTION_UP:
pcanvas.drawPath(path, paint);
path.reset();
invalidate();
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
return true;
}

private void touchMove(float upx, float upy){
float dx = Math.abs(downx-upx);
float dy = Math.abs(downy-upy);
if (dx >= 4 || dy >= 4) {
path.quadTo(downx, downy, (downx + upx)/2, (downy + upy)/2);
downx = upx;
downy = upy;
}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值