使用贝塞尔曲线算法实现毛笔签名效果

项目中需要实现手写签名功能,为提升用户体验,根据领导要求,使用贝塞尔曲线算法创建了类似毛笔书写的签名效果。通过调整曲线参数,成功实现了细腻的毛笔笔触,最终展示的签名效果自然流畅。
摘要由CSDN通过智能技术生成

最近项目中有个需要签名的地方,要用到手写签名,开始只是简单的实现手写签名,如图:
这里写图片描述

后来领导说,能不能实现像毛笔那样签名的效果,那好吧,领导说怎样就怎样吧,而且我也觉得这里用毛笔效果会更好些。那就只好运用贝塞尔曲线的原理了。实现如下:

/**
     * This view implements the drawing canvas.
     * 
     * It handles all of the input events and drawing functions.
     */
    class PaintView extends View {
        private Paint paint;
        private Canvas cacheCanvas;
        private Bitmap cachebBitmap;
        private Path path;
        private List<TimePoint> mPoints = new ArrayList<>();
        private float mVelocityFilterWeight;
        private float mLastTouchX;
        private float mLastTouchY;
        private float mLastVelocity;
        private float mLastWidth;
        private int mMinWidth;
        private int mMaxWidth;
        private RectF mDirtyRect;

        public Bitmap getCachebBitmap() {
            return cachebBitmap;
        }

        public void setSignatureBitmap(Bitmap signature) {
            clear();
            ensureSignatureBitmap();
            RectF tempSrc = new RectF();
            RectF tempDst = new RectF();

            int dWidth = signature.getWidth();
            int dHeight = signature.getHeight();
            int vWidth = getWidth();
            int vHeight = getHeight();

            // Generate the required transform.
            tempSrc.set(0, 0, dWidth, dHeight);
            tempDst.set(0, 0, vWidth, vHeight);

            Matrix drawMatrix = new Matrix();
            drawMatrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.START);

            Canvas canvas = new Canvas(cachebBitmap);
            canvas.drawBitmap(signature, drawMatrix, null);
            // setIsEmpty(false);
            invalidate();
        }

        public PaintView(Context context, AttributeSet attrs) {
            super(context, attrs);
            TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
                    R.styleable.SignaturePad, 0, 0);

            // Configurable parameters
            try {
                mMinWidth = a.getDimensionPixelSize(
                        R.styleable.SignaturePad_minWidth, convertDpToPx(3));
                mMaxWidth = a.getDimensionPixelSize(
                        R.styleable.SignaturePad_maxWidth, convertDpToPx(12));
                mVelocityFilterWeight = a.getFloat(
                        R.styleable.SignaturePad_velocityFilterWeight, 0.6f);
            } finally {
                a.recycle();
            }
            init();
        }

        private void init() {
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.BLACK);
            path = ne
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值