Android 在Canvas中实现画笔效果(一)--钢笔
如题:
公司要求做一个涂鸦板,要有钢笔、毛笔等画笔效果,网上搜了很多,可是效果不怎么好,决定自己研究下。废话不多说,进入正题。
首先,赛贝尔曲线弄明白了,在画曲线的过程中就是一条条的向量。
第二,曲线在画的过程中要有粗细变化(就是简单的实现)
第三,在原有向量的两侧也画两个两向量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)):
原文地址:http://blog.csdn.net/sbduxing/article/details/39343465
Android 在Canvas中实现画笔效果(一)--钢笔的更多相关文章
- android中实现毛笔效果(View 中画图)
近期有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果.传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序.然而要达到毛笔的笔锋效果则须要更为具体点的设计.我的 ...
- Android中使用画笔和画布绘制一个矩形
场景 在Android中画笔使用Paint类,画布使用Canvas类来表示. 绘图的基本步骤 首先编写一个继承自View的自定义View类,然后重写其onDraw方法,最后把自定义的view添加到ac ...
- android用canvas绘制两种波纹效果
波形效果有几种不同的呈现形式,比如从中间向四周散开的波形,也就是熟知的水涟漪:还有上下波动的曲线,像五线谱等.英文中可以称作Wave或者Ripple,所以暂且叫它们WaveView.WaveLayo ...
- HTML5在canvas中绘制复杂形状附效果截图
HTML5在canvas中绘制复杂形状附效果截图 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath() : 开始绘制一个新路 ...
- 在Android界面特效中如何做出和墨迹天气及UC中左右拖动的效果
(国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) 在Android界面特效中如何做出和墨迹天气及UC中左右拖动的效果 相信这么多手机APP中 ...
- <canvas>中isPointInPath()方法在不同绘制内容中的效果
<canvas>是HTML5中新增加的一个元素,我们可以使用脚本(通常使用JavaScript)在上面绘制图形,就像个画布一样.我们可以用它来绘制图表.制作一些动画.默认大小为300px ...
- 浅谈canvas中的拖尾效果
引言 很早就想了解以下 canvas 中的拖尾效果(如彗星,烟花等效果)是怎么实现的,但是一直没有深入了解,正巧在 codepen 上看到一个 demo,代码简单,效果炫酷,故有此文. 什么黑科技 在 ...
- android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果
主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import j ...
- 简单入门canvas - 通过刮奖效果来学习
一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...
随机推荐
- NLog配置文件写入数据库中
NLog配置文件: <target xsi:type="Database" name="database" connectionString=" ...
- 擦掉STM32F429芯片上的数据的一个方法
刚入手一块STM32F429Discovery.手痒痒的,准备写个程序进去.一不小心,把MCU的调试接口SW.JTAG全部给禁用了.这下可坏了,写不进去程序,擦不掉数据.愁的某家一头大汗.突然想起了当 ...
- maven Error resolving version for plugin 'org.apache.maven.plugins:maven-eclipse-plugin' from the repositories 解决
报错:Error resolving version for plugin 'org.apache.maven.plugins:maven-eclipse-plugin' from the repos ...
- 代码管理 – SVN
代码管理工具也用了不少年了,整理下. 管理工具比较 用过VSS,CVS,TFS,SVN还有一个微软内部使用的不记得什么名字了.这里进行一些简单比较,重点介绍SVN的用法. CVS历史悠久,1986年就 ...
- List Arraylist 数组的区别
数组.List和ArrayList的区别 数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如: ]; //赋值 s[]=]=]="c"; //修 ...
- win7 audio repeater 虚拟声卡 屏幕录像专家
- openssl之rsa
格式 openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filen ...
- [手机取证] CelleBrite UFED Touch系列使用视频
CelleBrite UFED Touch系列产品使用指导视频 (持续更新中) 1. CelleBrite UFED Touch产品介绍
- Xcode 7 调试野指针利器 Address sanitizer
Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error dete ...
- SQL Server performance tips
Refer to: http://harriyott.com/2006/01/sql-server-performance-tips A colleague of mine has been look ...