在最近的开发项目中,要实现自定义写字板实现签名和用图片做橡皮擦实现擦除功能,这就需要动态添加图片,然后拖动图片的同时,实现擦除的效果,具体步骤如下:
1.自定义写字板:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
public class WritingBoardView extends View {
// 定义记录前一个拖动事件发生点的坐标
float preX;
float preY;
private Path mPath;
private Paint mEraserPaint;
public Paint mPaint = null;
private int Pen = 1;//画笔
private int Eraser = 2;//橡皮擦
private int mMode = 1;
// 定义一个内存中的图片,该图片将作为缓冲区
Bitmap mCacheBitmap = null;
// 定义cacheBitmap上的Canvas对象
Canvas mCacheCanvas = null;
private onLocationListener mLocationListener;/*listen to the Rect */
public WritingBoardView(Context context) {
this(context,null);
}
public WritingBoardView(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
// 创建一个与该View相同大小的缓存区
setScreenWH();
mPath = new Path();
// 设置cacheCanvas将会绘制到内存中的cacheBitmap上
mCacheCanvas.setBitmap(mCacheBitmap);
// 设置画笔的颜色
mPaint = new Paint(Paint.DITHER_FLAG);
mPaint.setColor(Color.RED);
// 设置画笔风格
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(3);
// 反锯齿
mPaint.setAntiAlias(true);
mPaint.setDither(true);
//橡皮擦
mEraserPaint = new Paint();
mEraserPaint.setAlpha(0);
//这个属性是设置paint为橡皮擦重中之重
//这是重点
//下面这句代码是橡皮擦设置的重点
mEraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
//上面这句代码是橡皮擦设置的重点(重要的事是不是一定要说三遍)
mEraserPaint.setAntiAlias(true);
mEraserPaint.setDither(true);
mEraserPaint.setStyle(Paint.Style.STROKE);
mEraserPaint.setStrokeJoin(Paint.Join.ROUND);
mEraserPaint.setStrokeWidth(50);
}
private void setScreenWH() {
DisplayMetrics dm = new DisplayMetrics();
dm = this.getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
mCacheBi