Android 在Canvas中实现画笔效果(一)--钢笔
来源:互联网 发布:淘宝联系在线客服 编辑:程序博客网 时间:2024/04/30 05:36
如题:
公司要求做一个涂鸦板,要有钢笔、毛笔等画笔效果,网上搜了很多,可是效果不怎么好,决定自己研究下。废话不多说,进入正题。
首先,赛贝尔曲线弄明白了,在画曲线的过程中就是一条条的向量。
第二,曲线在画的过程中要有粗细变化(就是简单的实现)
第三,在原有向量的两侧也画两个两向量A1B1、A2B2。如下图:
上图中,线段A1A2的长度跟画笔移动速度存在f1(x)的关系。黑色曲线是向量AB通过赛贝尔画出来的效果。
下面介绍画笔实现的逻辑:
为了实现画笔效果,其实就是一共画了三条赛贝尔曲线,分别根据向量A1B1,AB,A2B2所得(见上图)。A1、A2是通过AB向量求得的,A点是向量A1A2的中点,AB垂直于A1B1。
再经过多次测试后,我找到了计算A1A2长度值是比较关键的问题,单纯的靠一个线性函数算出来的结果显示很糟糕。个人推荐:利用正选函数或者余弦函数的变化来求得。代码如下:
<span style="white-space:pre"></span>private final float KEY_PAINT_WIDTH=2.5f;//当速度很慢时,画出的曲线为画笔宽度的多少倍,此值经过测试不会有间隙或者很小。/** * 根据变化的余弦函数y=0.5*[cos(x*PI)+1](0<x<1),将速度转化为画笔宽度的2.5倍。 * x<0,宽度为最大宽度,2.5倍画笔宽度 * 0<x<1,根据上面函数,进行转化 * x>1,根据函数y=width/x,当y<0.2时,取最小值0.2 * @param delayTime * @return */private float controlPaint(double v){//余弦函数//y=0.5*[cos(x*PI)+1]float result=KEY_PAINT_WIDTH*paintSize;if(v<0){}else if(v<1){result=(float) (0.5*paintSize*KEY_PAINT_WIDTH*(Math.cos(v*Math.PI)+1));}else{result=((float) (paintSize/v>0.1?paintSize/v:0.1));}return result;}转化函数需要根据自己测定的画笔速度的合适值进行相应的转化,这里不做过多赘述。
实现书写的效果如下图(测试在平板(分辨率1280*800)):
(PS:第一次发表文章,勿喷!)
2 0
- Android 在Canvas中实现画笔效果(一)--钢笔
- Android高级画笔效果实现的探索
- 使用画笔和钢笔
- canvas画笔(涂鸦)
- HTML5 canvas 在线画笔绘图工具(一)
- android paint(画笔)及Canvas(画布)的使用
- Android 的Paint(画笔)及Canvas(画布)
- Android Paint类(画笔类) Canvas 类
- Android 中通过Canvas 与线程结合实现动画效果
- 【Android】自定义View、画家(画布)Canvas与画笔Paint的应用——画图、涂鸦板app的实现
- Android 画笔画布基础(一)
- canvas实现简单的画笔功能
- html5 canvas 画笔透明的实现方法
- Android 的画布Canvas和画笔Paint
- android canvas画布 和 Paint画笔
- 在canvas上实现3D效果
- Android画板开发(一) 基本画笔的实现
- 画笔使用(一)
- hdu5017 Ellipsoid 三分套三分
- RSS源推荐大全
- Enabling SSL for Keystone 阅读各种文献
- 关于Page Fault的一些整理
- iOS中的手势
- Android 在Canvas中实现画笔效果(一)--钢笔
- SSH 提示Could not load host key: /etc/ssh/ssh_host_rsa_key
- mongodb连接数据库带账号密码的需要在java中添加
- ML学习心得(4)----SVM支持向量机 之二
- 解决Oracle 中文乱码
- Dev C++初体验
- mysql汉字按字母顺序排序
- Spark:一个高效的分布式计算系统
- Android组件系列----Activity组件详解