public class DrawView extends View {
private Paint myPaint;
private Bitmap myBitmap;
private Canvas myCanvas;
private Path myPath;
// private int width;
// private int height;
private int silentX;
private int silentY;
public DrawView(Context context) {
this(context, null);
}
public DrawView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
myPaint = new Paint();
myPath = new Path();
// width,height的值在onMeasure之前无法得到,因此myBitmap的创建不能早于onMeasure
// myBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// myCanvas = new Canvas(myBitmap);
myPaint.setAntiAlias(true);
myPaint.setDither(true);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeJoin(Paint.Join.ROUND); // 连接处平滑圆角
myPaint.setStrokeCap(Paint.Cap.ROUND); // 画笔的样式为圆角
myPaint.setStrokeWidth(20);// 设置画笔宽度
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
/*或者
int width = getMeasuredWidth();
int height = getMeasuredHeight();*/
myBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
myCanvas = new Canvas(myBitmap);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
silentX = x;
silentY = y;
myPath.moveTo(silentX, silentY);
break;
case MotionEvent.ACTION_MOVE:
int dx = Math.abs(x - silentX);
int dy = Math.abs(y - silentY);//
// 滑动超过一定距离才进行更新
if (dx > 3 || dy > 3) {
myPath.lineTo(x, y);
silentX = x;
silentY = y;
invalidate();
}
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
drawPath();
canvas.drawBitmap(myBitmap, 0, 0, null);
}
private void drawPath() {
myCanvas.drawPath(myPath, myPaint);
}
}
简单的双缓冲画板
最新推荐文章于 2021-02-12 20:49:22 发布