android中实现毛笔效果(View 中画图)
近期有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果。传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序。然而要达到毛笔的笔锋效果则须要更为具体点的设计。我的实现思路是通过以触摸事件DOWN、MOVE、UP中的每个点为圆心画圆,除此之外还可通过触摸压力的大小改变所绘圆的半径,这样一连串的圆便可粗略地模拟毛笔笔锋效果,在设计次效果时遇到两个问题:
1:android触摸中的MOVE时间取点的频率不是非常高,会隔一定的像素取点。当轻触滑动时会出现一天不连续圆的情况,明显不符合笔锋效果。之后我的解决的方法是在相邻的圆之间drrawLine,画笔的大小与圆的直径大小几乎相同,如此便将略显离散的圆连起来形成连续的笔锋效果。
2. 写字板类似的程序说白了就是在画布上绘制多条曲线。我的实现是在继承自View类的OnTouch事件中将屏幕中的点保存到List中(List<List<Object>>).每加入一个点都invalidate重绘画布(onDraw). 在onDraw函数绘制线条的时候遍历List。每个点画圆,圆之间通过Line连接。
測试时发现当线条过多时程序会出现卡顿现象。自习回想绘制这一过程会发现是onDraw中频繁绘制影响了程序的效率。 在此情况下通过通过图片缓存技术非常好的攻克了这个问题,详细实现思路例如以下:建立一个缓冲画布。和缓冲bitmap,onTouch事件中将圆及Line绘制到缓冲bitmap中。在onDraw函数中直接将缓冲bitmap绘制到canvas中(canvas.drawBitmap(bitmap.paint)).
当然如此设计出来的笔锋效果还非常粗糙。后期还可通过每一笔画的起点,转折点及收尾点设计不同的形状来丰富毛笔笔锋的效果
效果图例如以下
ps:没书法基础,字拙勿喷
android中实现毛笔效果(View 中画图)的更多相关文章
- Android学习笔记(第二篇)View中的五大布局
PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念 view是什么呢?我们已经知道一个Act ...
- 关于YII中layout中的布局和view中数据的关系
1. view中解释php脚本后显示出的内容会在layout中以<?php echo $content?>输出. 2. view是对应的controller的实例,所以可以通过$this- ...
- Android通过onDraw实现在View中绘图操作
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图. 下面是一个简单的例子: public class AndroidTest extends Activity { /** C ...
- 【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线
最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧.现在就来说一说如何如何去 ...
- android 编程小技巧(持续中)
first: Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...
- Android查缺补漏(View篇)--自定义 View 的基本流程
View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以 ...
- 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动
在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...
- Android View中滚动相关
方法 scrollTo: (内容的左上角)达到某个地点 scrollBy: 根据当前位置,再移动多少 属性: mScrollX, 以下是文档解释 The offset, in pixels ...
- Android中自定义样式与View的构造函数中的第三个参数defStyle的意义
零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第 ...
随机推荐
- Ubuntu 16.04下用Wine运行的软件出现方块的解决思路(应该是兼容现在所有平台的Wine碰到这个的问题)
说明: 1.我使用的是深度的deepin-wine,版本为1.9.0,参考:http://www.cnblogs.com/EasonJim/p/8016674.html 2.这种问题没有一定的解决的方 ...
- Word中如何设置图片与段落的间距为半行
第一种: 正文为5号,那么图片或者Viso对象前后空一行,设置字号为7号或者更小,这样设置的间距就是那个7号字的间距,比5号小,看着空白不是那么大. 第二种: Visio对象转为jpg,然后选中图片和 ...
- 查看linux内核版本及操作系统版本的命令
一.查看内核版本命令: (1)[root@localhost ~]#cat/proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012.b ...
- 【转】Kriging插值法
einyboy 原文LINK Kriging插值法 克里金法是通过一组具有 z 值的分散点生成估计表面的高级地统计过程.与插值工具集中的其他插值方法不同,选择用于生成输出表面的最佳估算方法之前,有效使 ...
- Android反编译调试源码
Android反编译调试源码 1. 反编译得到源码 直接在windows 命令行下输入命令java -jar apktool_2.0.0.jar d -d 小米运动_1.4.641_1058.apk ...
- linux就该这么学之新手必须掌握的linux命令
常用的系统工作命令 1echo:用于在终端显示字符串或变量 格式为:“echo [字符串|变量]” 2date:用于显示/设置系统的时间或日期 格式为:“data[选项][+指定格式]” 3rebot ...
- boolean类型的特殊的get和set方法
public class D { private boolean a; public boolean isA() { return a; } public void setA(boolean a) { ...
- 为windows开启winrm service, 以便进行远程管理
为windows开启winrm service, 以便进行远程管理 是windows 一种方便远程管理的服务:开启winrm service,便于在日常工作中,远程管理服务器,或通过脚本,同时管理 ...
- [GraphQL] Reuse Query Fields with GraphQL Fragments
A GraphQL fragment encapsulates a collection of fields that can be included in queries. In this vide ...
- [Angular] Debug Angular apps in production without revealing source maps
Source: https://blog.angularindepth.com/debug-angular-apps-in-production-without-revealing-source-ma ...