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是用的比较多也比较复杂的一个,简单的入门了一下, ...
随机推荐
- 使用log4net 日志输出到数据库MySQL
使用Log4Net的输出日志到MySQL 使用步骤如下: 1. 添加引用Log4Net.dll, mysql.data.dll到工程中 note: mysql.data.dll 版本要高,最好到mys ...
- MySQL concat函数的使用
MySQL concat函数是MySQL数据库中众多的函数之一,下文将对MySQL concat函数的语法和使用进行说明,供您参考和学习. MySQL concat函数使用方法:CONCAT(str1 ...
- storm基础系列之一----storm并发度概念剖析
前言: 学了几天storm的基础,发现如果有hadoop基础,再理解起概念来,容易的多.不过,涉及到一些独有的东西,如调度,如并发度,还是很麻烦.那么,从这一篇开始,力争清晰的梳理这些知识. 在正式学 ...
- onAttachedToWindow () 和 onDetachedFromWindow () (转)
原文地址:http://blog.sina.com.cn/s/blog_74c22b2101012urv.html
- Nhibernate对应关系参数介绍
一.多对一关联映配置介绍 <many-to-one name="PropertyName" 属性名 column="column_name" 数据库字段名 ...
- XE6 & IOS开发之免证书真机调试(2):连接真机并运行App(有图有真相)
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 连接真机前,请先确保真机 ...
- extentreports报告插件之extentX之服务搭建(三)
之前两个章节已经写完再extentreports报告插件与testng 的集成,但是发现 每次测试完后,生成的报告都要在单独发送,每个项目都有一份报告,如果项目多的话,管理起来就会很冗余. 这个给大家 ...
- 学习FFmpeg API
ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- extends 和 implements
extends是继承类与类的 implements是实现接口的 类与类之间只支持单继承 接口与接口之间支持多继承