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技术。一起壮大我们的微信干货分享社区。
Android 涂鸦最佳实践的更多相关文章
- Android开发最佳实践《IT蓝豹》
Android开发最佳实践 移动开发Android经验分享应用GoogleMaterial Design 摘要:前 段时间,Google公布了Android开发最佳实践的一系列课程,涉及到一些平时 ...
- Android开发最佳实践
Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...
- [转]Android开发最佳实践
——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...
- Android 异常处理最佳实践
一个好的app 异常处理机制 我认为应该至少包含以下几个功能: 1.能把错误信息上传到服务器 让开发者可以持续改进app 2.错误信息至少应该包含 是否在主进程 是否在主线程 等可以帮助程序员定位的 ...
- 转:使用Android API最佳实践
原文来自于:http://blog.jobbole.com/65170/ 写在前面 现在,Android应用程序中集成第三方API已十分流行.应用程序都有自己的网络操作和缓存处理机制,但是大部分比较脆 ...
- Android SharedPreference最佳实践
Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...
- Android 开发最佳实践
原文地址:https://github.com/futurice/android-best-practices/blob/master/translations/Chinese/README.cn.m ...
- (转)iOS 最佳实践
本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Pr ...
- Android 6.0 权限管理最佳实践
博客: Android 6.0 运行时权限管理最佳实践 github: https://github.com/yanzhenjie/AndPermission
随机推荐
- 《UNIX环境高级编程》笔记--文件共享
1.文件共享 内核使用3种数据结构来表示打开的文件,他们的关系如下: 每个进程都有一张进程表项,记录进程打开的文件: fd标志:close_on_exec,若一个文件描述符在close_on_exec ...
- APUE学习之---------------进程
离职了,交接期也有足够的时间了,可以在好好的再看一下APUE,想想上次详细的看还是在两年之前,虽然中间也偶尔会翻出来看看,但是由于工作上交集相对比较少一直没有去细读一下.现在正好是一段空挡期可以好好看 ...
- nginx自定义模块记录上游服务器特定响应头
功能,服务器通过扩展自定义命令,记录上游的服务器返回的特定响应头内容,记录到本地文件中 代码如下: /* * Copyright (C) Ciaos */ #include <ngx_confi ...
- Java_java多线程下载-断点下载-超详细
基本原理:利用URLConnection获取要下载文件的长度.头部等相关信息,并设置响应的头部信息.并且通过URLConnection获取输入流,将文件分成指定的块,每一块单独开辟一个线程完成数据的读 ...
- uva311 - Packets(贪心)
题目:311 - Packets 题目大意:给出1*1, 2*2,3 *3, 4*4, 5*5, 6*6的箱子的个数,如今有若干个6*6的箱子,问最少用多少个箱子能够将给定的箱子都装进去. 解题思路: ...
- 【转】Configuring VM Acceleration on Linux
Configuring VM Acceleration on Linux Linux-based systems support virtual machine acceleration throug ...
- javascript事件及事件传输
函数必须调用才能执行,可a()加下面的函数调用 JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. 2.属性(当这些事件的属性发生时, ...
- linux: telnet
问题: telnet: connect to address 192.168.1.103: Connection refused 总结:{ 1. 需要开启telnet服务, /etc/xinetd.d ...
- [Swust OJ 799]--Superprime Rib(DFS)
题目链接:http://acm.swust.edu.cn/problem/799/ Time limit(ms): 1000 Memory limit(kb): 10000 Description ...
- python subprocess重定向标准输出
subprocess.call("ping -c 1 %s" % ip,shell = True,stdout = open('/dev/null','w'),stderr = s ...