public class FingerPaintView extends View { /** * 绘制手指移动的路径画笔 */ private Paint pathPaint; /** * 手指移动的路径 */ private Path mPath; /** * 绘制path的canvas */ private Canvas mCanvas; /** * 保存绘制内容 */ private Bitmap mBitmap; /** * 绘制bitmap的paint */ private Paint mPaint; /** * 上一记录的次x */ private float mX; /** * 上一次记录的y */ private float mY; /** * 最小的移动宽度 */ private final int TOUCH_TOLERANCE = 4; public FingerPaintView(Context context) { this(context, null); } public FingerPaintView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public FingerPaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); pathPaint = new Paint(); pathPaint.setAntiAlias(true); pathPaint.setColor(Color.BLACK); pathPaint.setStrokeWidth(10); pathPaint.setStrokeCap(Paint.Cap.ROUND); pathPaint.setStyle(Paint.Style.STROKE); mPath = new Path(); mPaint = new Paint(Paint.DITHER_FLAG); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, mPaint); canvas.drawPath(mPath, pathPaint); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: fingerDown(x, y); break; case MotionEvent.ACTION_MOVE: fingerMove(x, y); break; case MotionEvent.ACTION_UP: fingerUp(); break; default: } return true; } /** * 手指按下 * * @param x * @param y */ private void fingerDown(float x, float y) { mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; } /** * 手指移动 * * @param x * @param y */ private void fingerMove(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { //贝塞尔曲线 mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); mX = x; mY = y; } invalidate(); } /** * 手指抬起 */ private void fingerUp() { mCanvas.drawPath(mPath, pathPaint); mPath.reset(); } /** * 清空画布 */ public void clear() { mCanvas.drawColor(0, PorterDuff.Mode.CLEAR); invalidate(); } }
Android简易画板的实现
最新推荐文章于 2021-05-26 20:02:22 发布