自定义签名工具相信大家都轻车熟路,通过监听屏幕onTouchEvent事件,分别在按下(ACTION_DOWN)抬起(ACTION_UP)移动(ACTION_MOVE) 动作中处理触碰点的收集和绘制,很容易就达到了手签笔的效果。其中无非又涉及到线条的撤回、取消、清除、画笔的粗细,也就是对收集的点集合和线集合的增删操作以及画笔颜色宽的的更改。这些功能都在 实现一个自定义有限制区域的图例(角度自识别)涂鸦工具类(上) https://juejin.cn/post/7202260878930591802中介绍过。

作者:似曾相识2022 链接:https://juejin.cn/post/7244192848063627325

但就在前不久遇到一个需求是要求手签笔能够和咱们使用钢笔签名类似的效果,当然这个功能目前是有一些公司有成熟的SDK的,但我们的需求是要不借助SDK,自己实现笔锋效果。那么,如何使画笔带笔锋呢?废话不多说,先上效果图:

要实现笔锋效果我们需要考虑几个因素:笔速笔宽按压力度(针对手写笔)。因为在onTouchEvent回调的次数是不变的,一旦笔速变快两点之间距离就被拉长。此时的笔宽不能保持在上一笔的宽度,需要我们通过计算插入新的点,同时计算出对应点的宽度。同理当我们笔速慢的时候,需要通过计算删除信息相近的点。要想笔锋自然,当然贝塞尔曲线是必不可少的。

这里我们暂时没有将笔的按压值作为笔宽的计算,仅仅通过笔速来计算笔宽。

/*** 计算新的宽度信息*/
public double calcNewWidth(double curVel, double lastVel,double factor) {double calVel = curVel * 0.6 + lastVel * (1 - 0.6);double vfac = Math.log(factor * 2.0f) * (-calVel);double calWidth = mBaseWidth * Math.exp(vfac);return calWidth;
}/*** 获取点信息*/
public ControllerPoint getPoint(double t) {float x = (float) getX(t);float y = (float) getY(t);float w = (float) getW(t);ControllerPoint point = new ControllerPoint();point.set(x, y, w);return point;
}/*** 三阶曲线的控制点*/
private double getValue(double p0, double p1, double p2, double t) {double a = p2 - 2 * p1 + p0;double b = 2 * (p1 - p0);double c = p0;return a * t * t + b * t + c;
}

最后也是最关键的地方,不再使用drawLine方式画线,而是通过drawOval方式画椭圆。通过前后两点计算出椭圆的四个点,通过笔宽计算出绘制椭圆的个数并加入椭圆集。最后在onDraw方法中绘制。

/*** 两点之间将视图收集的点转为椭圆矩阵 实现笔锋效果*/
public static ArrayList<SvgPointBean> twoPointsTransRectF(double x0, double y0, double w0, double x1, double y1, double w1, float paintWidth, int color) {ArrayList<SvgPointBean> list = new ArrayList<>();//求两个数字的平方根 x的平方+y的平方在开方记得X的平方+y的平方=1,这就是一个园double curDis = Math.hypot(x0 - x1, y0 - y1);int steps;//绘制的笔的宽度是多少,绘制多少个椭圆if (paintWidth < 6) {steps = 1 + (int) (curDis / 2);} else if (paintWidth > 60) {steps = 1 + (int) (curDis / 4);} else {steps = 1 + (int) (curDis / 3);}double deltaX = (x1 - x0) / steps;double deltaY = (y1 - y0) / steps;double deltaW = (w1 - w0) / steps;double x = x0;double y = y0;double w = w0;for (int i = 0; i < steps; i++) {RectF oval = new RectF();float top = (float) (y - w / 2.0f);float left = (float) (x - w / 4.0f);float right = (float) (x + w / 4.0f);float bottom = (float) (y + w / 2.0f);oval.set(left, top, right, bottom);//收集椭圆矩阵信息list.add(new SvgPointBean(oval, color));x += deltaX;y += deltaY;w += deltaW;}return list;
}

至此一个简单的带笔锋的手写签名就实现了。 最后附上参考链接Github(https://github.com/GdinKing/HandWrite)

关注我获取更多知识或者投稿

Android:自定义View实现签名带笔锋效果相关推荐

  1. Android 自定义view完全解析--带你通透了解自定义view

    参考转自郭霖博客带你一步步深入了解View系列 Android LayoutInflater原理分析 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用 ...

  2. Android自定义View,跟随手指滑动效果

    Android自定义View,实现跟随手指滑动效果, 效果如下: 一,重写onTouchEvent方法 最后返回true 二,在MotionEvent.ACTION_MOVE情况下改变自定义view ...

  3. android 屏幕飘动,Android自定义View实现飘动的叶子效果(三)

    上一篇对自定义View及一些方法有所了解,下面做一个简单的叶子飘动的例子 主要技术点 1.添加背景图片canvas.drawBitmap() 2.Matrix动画类 3.Matrix添加到画布上 步骤 ...

  4. android自定义拱形,Android自定义View实现圆弧进度的效果

    前言 Android开发中,常常自定义View实现自己想要的效果,当然自定义View也是Android开发中比较难的部分,涉及到的知识有Canvas(画布),Paint(画笔)等,自定义控件分为三种: ...

  5. android自定义计步器形状,Android自定义View仿QQ运动步数效果

    本文实例为大家分享了Android QQ运动步数的具体代码,供大家参考,具体内容如下 今天我们实现下面这样的效果: 首先自定义属性: 自定义View代码如下: /** * Created by Mic ...

  6. android 图片跑马灯动画,【Android自定义View】- 文本跑马灯效果

    简介 有些时候,文字过长,或者有多条需要展示的文本时,我们需要将文本进行左右滚动,多条文本时,还得上下滚动以实现展示不同的文本内容.这时候就需要我们自定义view来实现文本跑马灯效果了. 效果图 jj ...

  7. Android自定义View(广告栏上下滚动效果)

    需求中涉及到的广告栏变化千变万化,这里,我们综合取材,有了下面的这篇文章. 开始的时候,我们使用的是MarqueeView,继承的ViewFlipper,但是会有一些bug,比如刷新数据时的重叠阴影等 ...

  8. Android自定义View实现滴滴验证码输入框效果

    先上效果图让大家看看 1.VerficationCodeInput.Java /** * 輸入验证码的自定义view * */ public class VerificationCodeInput e ...

  9. android 抛物线轨迹,Android自定义View——贝塞尔曲线实现抛物线效果

    效果展示 原理分析 抛物线效果最主要的难点和原理在于贝塞尔曲线动画的生成,我们通过图片主要讲解贝塞尔曲线动画,这里用到的是二级贝塞尔曲线 1.需要找到贝塞尔曲线的三个点,开启点.结束点.控制点 2.通 ...

最新文章

  1. python绘制数学三维图
  2. Nginx-从零开始使用nginx实现反向代理及负载均衡
  3. 宁波大学2013 计算机应用基础 高级c语言程序 练习册答案,2020年宁波大学计算机应用技术考研真题试卷及试题答案,计算机系统基础考研试题下载...
  4. Consumer接口练习之按要求打印信息
  5. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?
  6. kotlin为什么比java编译慢_为什么Kotlin编译速度比Scala快? [关闭]
  7. hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix
  8. 阿里云服务器部署django项目
  9. 电脑安装系统后出现no bootable device_炉石传说:用电脑领取安卓和iOS专属卡包你能信?亲测有效!...
  10. R - 变化plot字形,嵌入字体以pdf
  11. 安装SQLServer2016出错提示:需要安装oracle JRE7 更新 51(64位)或更高版本2种解决办法.
  12. 包括淘宝天猫API明细接口
  13. Microsemi Libero使用技巧5——使用FlashPro生成stp程序文件
  14. 30.STM32 DS18B20
  15. 搜狗android平板专用,搜狗推首款支持Android 3.0平板专用输入法
  16. 如何做好会员管理与维护?
  17. 码神军训(四,五)——代码跳舞军体拳
  18. 计算机和hdmi无法正常显示,Win7系统下电脑HDMI连接显示器字体显示虚不清楚如何解决...
  19. 亚马逊 AWS-S3 文件服务器使用
  20. 爱普生Epson XP-600 一体机驱动

热门文章

  1. Kotlin开发中的一些Tips
  2. IIS部署阿里云SSL证书
  3. python中print()函数的功能与格式
  4. 实现虚拟主机网站的三种方法
  5. 在TCP/IP网络中,为各种公共服务保留的端口号范围
  6. 带你了解边缘云到底是什么云?
  7. RegexBuddy布局异常修复方法
  8. URL - 统一资源定位器
  9. 自建机房和托管的区别
  10. 递归算法是一种直接或者间接调用自身函数或者方法的算法