Android 涂鸦最佳实践

Android中实现手势绘图一般都两种方式,一是直接在View上绘制,而是使用SurfaceView。两者还是有一些区别的,简单介绍下。View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。 SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。所以呢,要实现涂鸦的功能优先选择后者。

在开始码代码之前,先简单理下要实现的功能。

1、可以自定义画笔的颜色

2、可以自定义画笔的粗细

3、可以实现各种常见形状的绘制

4、允许画布的回退,就是回到上一步

5、要支持橡皮擦功能

6、已作完的画,要支持保存

下面我们就逐步去实现这五个功能点。

一、关于自定义画笔的颜色和粗细,这个最简单,只须调用Paint的setColor(int color)和setStrokeWidth(float width)这两个方法即可。需要主要的是,使用SurfaceView绘图需要注意是通过SurfaceHolder获得Canvas实例,这时可以通过Canvas实例去绘图,绘制结束调用unlockCanvasAndPost(canvas)去提交改变。

二、支持自由曲线、直线、矩形、圆形、实心矩形、实心圆形,很方便的进行扩展。这里先抽象出一个基类Action,每一次的绘制都是一个action实例,我们的画板就是一个action的列表,这样就能很好的支持回退功能。

三、画布的回退。如果画布上的action列表大小不为0,表示画布目前是支持回退的,只须把列表中最后一个action给remove掉,重新绘制就OK了

四、橡皮擦。这里我取了个巧,画布的背景是白色的,所以橡皮擦的实现也是一个action,形状为自由曲线,颜色也为白色,这样就营造了一种被擦除的效果,其实只是被白色的曲线给遮盖住了。按照第三点的实现,橡皮擦也支持回退。

五、保存画板。画布上画满了你的各种图形,最后一步就是保存了,但是View和SurfaceView的截取是不同的,View是静态的被动的,SurfaceView是主动的动态的,如果使用View的截图方法只能得到一个黑屏。这时好办法就是把咱们保存的action列表重新绘制出来。代码如下

代码地址:https://github.com/JackCho/AndroidDoodle

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。

技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。

时间: 2024-08-11 09:45:12

Android 涂鸦最佳实践的相关文章

Android企业级最佳实践高手之路

如何从一个Android程序员到成为一个高手级别的Android开发者和架构师,是每个Android开发者和管理者关心的核心问题,成功的从一个Android程序员到架构师,需要掌握: 1, Android开发与架构,具备Android系统式如何驾驭开发者与架构者的的能力: 2, 通晓Android程序开发的最佳模式,当你直到这个最佳模式的时候,你会发现AsyncTask是Android的败笔,而且这个败笔一直未能够在版本升级中解决: 3, 理解Android程序开发和运行背后的控制者: 4, 合

Android开发最佳实践---Futurice之见

原文链接:https://github.com/futurice/android-best-practices 本文是Futurice公司的Android开发人员总结的最佳实践,遵循这些准则可以避免重复制造轮子.如果你对iOS或者WindowsPhone开发感兴趣,那么也请看看iOS最佳实践和Windows客户端开发最佳实践. 第一版翻译自:http://blog.csdn.net/asce1885 Android开发技术日新月异, Github上也有较大更新, 故对原文有增删 CSDN的mar

[转]Android开发最佳实践

——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/android-best-practices 本文是Futurice公司的Android开发人员总结的最佳实践,遵循这些准则可以避免重复制造轮子.如果你对iOS或者Windows Phone开发感兴趣,那么也请看看iOS最佳实践和Windows客户端开发最佳实践. 概要 使用Gradle和推荐的工程结构

Android 异常处理最佳实践

一个好的app 异常处理机制 我认为应该至少包含以下几个功能: 1.能把错误信息上传到服务器  让开发者可以持续改进app 2.错误信息至少应该包含 是否在主进程 是否在主线程 等可以帮助程序员定位的信息 3.最好包含手机硬件及软件信息. 4.主进程引发的异常 最好交由系统自己处理 也就是让用户可以感知到 那种(当然你也可以自己定义一套更有意思的感知系统对话框等,具体可参考各种有意思的404界面) 5.子进程引发的异常最好别让用户感知到.比如push之类的 这种 和用户感知弱关联的这种.最好发生

Android 开发最佳实践

从Futurice公司Android开发者中学到的经验. 遵循以下准则,避免重复发明轮子.若您对开发iOS或Windows Phone 有兴趣, 请看iOS Good Practices 和 Windows client Good Practices 这两篇文章.摘要 ??? 使用 Gradle 和它推荐的工程结构??? 把密码和敏感数据放在gradle.properties??? 不要自己写 HTTP 客户端,使用Volley或OkHttp库??? 使用Jackson库解析JSON数据???

Android开发最佳实践

这些经验没有经过系统性的梳理,想到哪就写到哪吧: 1.Android开发的MVC模式,或者MVVM模式 客户端开发,主要工作是界面及逻辑,如果界面相关的代码和逻辑相关的代码耦合太多,很不容易重构,在美团这一个月来,大家基本形成了一套行之有效的开发范式, 即界面元素如果不需要生命周期的话,一律已自定义view来实现,如果需要生命周期,则用fragment来实现. 1.Activity是界面的容器,负责界面的创建,刷新,不要在Activity中做过多的逻辑.对于Activity之间的跳转处理请放到A

android单元测试最佳实践一:android studio测试环境搭建

在使用android studio做单元测试之前需要安装好单元测试的插件:android-studio-unit-test-plugin 通过快捷键(alt + ctrl + S)进入setting,选择plugins 但是这里你会发现有个小小的问题,android studio安装plugins奇慢无比,也许你连远程库的内容都看不到?因为你被墙了,翻墙当然是用goagent了,没装的去这里:http://www.i7086.com/gugeyingyonggoagentrangninziyou

Android最佳实践之高效的应用导航

设计(一)- 规划Screens和他们之间的关系 原文地址:http://developer.android.com/training/design-navigation/screen-planning.html#beyond-simplistic-design 设计和开发Android应用程序的第一个步骤是确定用户能够查看和处理应用.一旦你知道用户与之交互的应用程序之间交互什么数据,下一步就是设计交互,允许用户导航到app的不同部分,进入和退出应用程序中的界面. 这篇文章开始向你展示如何规划高

(转)iOS 最佳实践

本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Practices,译文在 Github 上进行维护,同时在简书 上进行发布. 本文发出几天后发现网上也有了另外一个翻译版本:http://ios.jobbole.com/81830/ 原标题是iOS Good Practices,应该翻译成 iOS 良好实践/优秀实践的,不过好拗口,而且已经发出去了,