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