Android手写板签名

作者: 奔跑吧李博 | 来源:发表于2020-07-23 10:54 被阅读0次

演示效果:

Github代码地址

实现步骤

1.监听按下滑动手势,使用path绘制路径
2.加入清除画板功能
3.画笔颜色切换

关键实现代码:

/**
 * create by libo
 * create on 2020/7/23
 * description 画板自定义view
 */
public class DrawingBoardView extends View {
    private Paint paint;
    /** 笔颜色 */
    private int drawColor = Color.BLACK;
    /** 笔粗细 */
    private int drawWidth = 5;
    private Path path;
    /** 每次触碰画板时的横坐标 */
    private float downX;
    /** 每次触碰画板时的纵坐标 */
    private float downY;
    /** 最小画线距离,值越小,灵敏度越高 */
    private float minInvalidateLength = 2;

    public DrawingBoardView(Context context) {
        super(context);
        init();
    }

    public DrawingBoardView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(drawColor);
        paint.setStrokeWidth(drawWidth);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);

        path = new Path();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downX = event.getX();
                downY = event.getY();
                path.moveTo(downX, downY);  //将起点移动到当前按下位置
                break;
            case MotionEvent.ACTION_MOVE:
                //每移动超过一定单位距离,就判定需要在此路径上画曲线
                float difX = event.getX()-downX;
                float difY = event.getY()-downY;
                if (Math.abs(difX) > minInvalidateLength || Math.abs(difY) > minInvalidateLength) {
                    //画出该段距离的曲线,并将dif重置为0,重新计算差值
                    path.quadTo((downX+event.getX())/2, (downY+event.getY())/2, event.getX(), event.getY());
                    downX = event.getX();
                    downY = event.getY();
                }

                break;
        }

        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawPath(path, paint);
    }

    /**
     * 清空画布
     */
    public void clearPanel() {
        path.reset();
        invalidate();
    }

    /**
     * 设置画笔颜色
     */
    public void setPaintColor(int color) {
        this.drawColor = color;
        paint.setColor(color);
        invalidate();
    }

    /**
     * 设置画笔粗细
     * @param drawWidth
     */
    public void setDrawWidth(int drawWidth) {
        this.drawWidth = drawWidth;
        paint.setStrokeWidth(drawWidth);
    }

    /**
     * 从view获取bitmap
     * setDrawingCacheEnabled(true)  设置能否缓存图片信息
     * buildDrawingCache()  如果能够缓存图片,则创建图片缓存
     * getDrawingCache()  如果图片已经缓存,返回一个bitmap
     * destroyDrawingCache() 释放缓存占用的资源
     */
    public Bitmap getPanelBitmap() {
        return getDrawingCache();
    }

}

没有复杂的逻辑,就是使用path.quadTo()画曲线需要注意一下起点,结束点,控制点这三个点。

相关文章

网友评论

    本文标题:Android手写板签名

    本文链接:https://www.haomeiwen.com/subject/zgzrxktx.html