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技术。一起壮大我们的微信干货分享社区。

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

  1. Android开发最佳实践《IT蓝豹》

    Android开发最佳实践   移动开发Android经验分享应用GoogleMaterial Design 摘要:前 段时间,Google公布了Android开发最佳实践的一系列课程,涉及到一些平时 ...

  2. Android开发最佳实践

    Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...

  3. [转]Android开发最佳实践

    ——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...

  4. Android 异常处理最佳实践

    一个好的app 异常处理机制 我认为应该至少包含以下几个功能: 1.能把错误信息上传到服务器  让开发者可以持续改进app 2.错误信息至少应该包含 是否在主进程 是否在主线程 等可以帮助程序员定位的 ...

  5. 转:使用Android API最佳实践

    原文来自于:http://blog.jobbole.com/65170/ 写在前面 现在,Android应用程序中集成第三方API已十分流行.应用程序都有自己的网络操作和缓存处理机制,但是大部分比较脆 ...

  6. Android SharedPreference最佳实践

    Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...

  7. Android 开发最佳实践

    原文地址:https://github.com/futurice/android-best-practices/blob/master/translations/Chinese/README.cn.m ...

  8. (转)iOS 最佳实践

    本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Pr ...

  9. Android 6.0 权限管理最佳实践

    博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission

随机推荐

  1. HDU 2227 Find the nondecreasing subsequences

    题目大意:给定一个序列,求出其所有的上升子序列. 题解:一开始我以为是动态规划,后来发现离散后树状数组很好做,首先,c保存的是第i位上升子系列有几个,那么树状数组的sum就直接是现在的答案了,不过更新 ...

  2. Scrambled Polygon(斜率排序)

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7799   Accepted: 3707 ...

  3. CRC32 vs Java.HashCode

    找了容量为27万中文词库进行试验    CRC32 中冲突率 < 0.01%    而 Java.HashCode 有 4%    hashCode 的速度 应该比 CRC 快 2-3 倍 CR ...

  4. Ext JS学习第六天 Ext自定义类(一)

    此文来记录学习笔记 •我们在之前的学习,已经对ExtJS有了一个初步的认识,那么如果要学好ExtJS,对于javascript是必须的,也就是说,对于理解ExtJS底层基础架构的理解也是必须的.那么我 ...

  5. C# 日期格式转换 string类型 20150329 转换为 2015/03/29

    DateTime.ParseExact("20150329", "yyyyMMdd", System.Globalization.CultureInfo.Cur ...

  6. Android之判断设备网络连接状态,并判断连接方式

    在Android开发过程中,对于一个需要连接网络的Android设备,对设备的网络状态检测是很有必要的!有很多的App都需要连接网络.判断设备是否已经连接网络,并且在连接网络的状态下判断是wifi无线 ...

  7. C#后台跳转

    后台跳转的方法: 1.js脚本 [不推荐使用] Context.Response.Write("<script language=javascript>window.locati ...

  8. ThinkPHP第四天(U函数,URL类型参数配置,伪静态后缀名配置,数据传递与获取$_GET等)

    1.U('地址','参数','伪静态','是否跳转','是否显示域名'); 在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码. 在模 ...

  9. mysql里的sql函数

    仅作为自己忘记时的查询 时间 now() 返回当前年-月-日 时:分:秒格式的时间 UNIX_TIMESTAMP() 当前的uninx时间戳 date_format(date,格式) date是年月日 ...

  10. chrome浏览器强制采用https加密链接

    在chrome地址栏输入chrome://net-internals/#hsts,然后把www.google.com添加到domain,并且Include subdomains全部沟上添加就可以了.