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:没书法基础,字拙勿喷

时间: 2024-10-03 13:00:54

android中实现毛笔效果(View 中画图)的相关文章

android中实现毛笔效果(View 中绘图)

最近有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果.传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序.然而要达到毛笔的笔锋效果则需要更为详细点的设计.我的实现思路是通过以触摸事件DOWN.MOVE.UP中的每一个点为圆心画圆,除此之外还可通过触摸压力的大小改变所绘圆的半径,这样一连串的圆便可粗略地模拟毛笔笔锋效果,在设计次效果时遇到两个问题: 1:android触摸中的MOVE时间取点的频率不是很高,会隔一定的像素取点,当轻触滑动时会出现一天不连续圆

Android学习笔记(第二篇)View中的五大布局

PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Activity是Android的显示层,但是Activity是不能直接显示在屏幕上的,它也像JSP那样,显示的东西是html,那么Android也不例外,Activity是一个抽象的壳子,而显示的东西就是view或者是viewgroup(图形用户组件)....   有了这个概念,我们就清楚view是如何

android 编程小技巧(持续中)

first: Intent跳转一般存用于Activity类,但是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,最终为:mContext.startActivity(intent);  换言之,以后在非activity类里调用activity的方法  一律这么做.若不行的话 可以这么做:(Activity)mContext. second: gridview中textview内容不能居中的问题.gridview中可以设置一

图解MotionEvent中getRawX、getRawY与getX、getY以及View中的getScrollX、getScrollY

1.getRawX.getRawY与getX.getY的区别 在编写android的自定义控件,或者判断用户手势操作时,往往需要使用MotionEvent中的getRawX().getRawY()与getX().getY()取得触摸点在X轴与Y轴上的距离,这四个方法都返回一个float类型的参数,单位为像素(Pixel).getRawX().getRawY()返回的是触摸点相对于屏幕的位置,而getX().getY()返回的则是触摸点相对于View的位置. 以下两张图直观的表现了这几个方法的区别

Android查缺补漏(View篇)--自定义 View 的基本流程

View是Android很重要的一部分,常用的View有Button.TextView.EditView.ListView.GridView.各种layout等等,开发者通过对这些View的各种组合以形成丰富多彩的交互界面,一个应用中界面交互的体验往往在应用的受欢迎程度上起了很关键得作用,所以开发者们大多会想方设法的做出一个更加精美的界面,例如:通过自定义View.深入学习View的原理以便更好的对其优化使其在操作起来更加流畅等等,也正因为如此,在面试中View也常常作为面试官重点考察的对象之一

Android中半透明Activity效果另法

Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有. 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidManifest.xml 1: <?xml version="1.0" encoding="utf-8"?> 2: <manifest xmlns:android="http://schemas.android.com/apk/res/android

Android View中滚动相关

方法 scrollTo: (内容的左上角)达到某个地点 scrollBy: 根据当前位置,再移动多少 属性: mScrollX, 以下是文档解释 The offset, in pixels, by which the content of this view is scrolled horizontally. mScrollY, 以下是文档解释 The offset, in pixels, by which the content of this view is scrolled vertica

android之在view中内嵌浏览器的方法

我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有一个用来显示网页的View呢,于是我就在eclipse里xml编辑器里输入<web,哈哈,果然下面有个提示是webVeiw,那么能不能用它呢?于是到网上搜一下它的资料,果然可以的,下面就开始吧. 先在xml里把webview建好,在代码里用findViewById()将其取出来.我的代码是: Web

Android中实现Bitmap在自定义View中的放大与拖动

一:基本实现思路 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对自定义View的触摸事件监听 放大与拖动 基于单点触控实现Bitmap对象在View上的拖动.并且检测View的边缘,防止拖动过界.基于两个点触控实现Bitmap对象在View上的放大.并且检测放大倍数.基于Matrix对象实现对Bitmap在View上放大与平移变换 Bitmap对象在View中的更新与显示 通过重载onDraw方法,