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)去提交改变。@Override

public void surfaceCreated(SurfaceHolder holder) {

Canvas canvas = mSurfaceHolder.lockCanvas();

canvas.drawColor(Color.WHITE);

mSurfaceHolder.unlockCanvasAndPost(canvas);

mActions = new ArrayList();

}

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

public int color;

Action() {

color = Color.BLACK;

}

Action(int color) {

this.color = color;

}

public abstract void draw(Canvas canvas);

public abstract void move(float mx, float my);

}

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

if (mActions != null && mActions.size() > 0) {

mActions.remove(mActions.size() - 1);

Canvas canvas = mSurfaceHolder.lockCanvas();

canvas.drawColor(Color.WHITE);

for (Action a : mActions) {

a.draw(canvas);

}

mSurfaceHolder.unlockCanvasAndPost(canvas);

return true;

}

return false;

}

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

mDoodle.setSize(10);

mDoodle.setColor("#ffffff");

break;

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

* 获取画布的截图

* @return

*/

public Bitmap getBitmap() {

bmp = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bmp);

doDraw(canvas);

return bmp;

}

github android涂鸦,Android 涂鸦最佳实践相关推荐

  1. Android应用性能优化最佳实践.

    移动开发 Android应用性能优化最佳实践 罗彧成 著 图书在版编目(CIP)数据 Android应用性能优化最佳实践 / 罗彧成著. -北京:机械工业出版社,2017.1 (移动开发) ISBN ...

  2. 提升Android开发效率的最佳实践

    本文属于Android入门与最佳实践系列,有兴趣的可以围观笔者的前一篇关于Android实践建议的文章:2016里一些Android最佳实践列表--Opinionated 原文地址 软件工程师的工作效 ...

  3. Android Q 分区储存: 最佳实践和几项更新

    作者: 软件工程师 Jeff Sharkey 和产品经理 Seb Grubb 应用沙盒是 Android 设计的核心部分,它可将不同的应用隔离.基于应用沙盒的基本原则,Android Q 引入了分区储 ...

  4. 《Android和PHP开发最佳实践》一1.3 如何学习Android和PHP

    1.3 如何学习Android和PHP 前面我们已经讨论过"为何学"的问题,大家应该对Android加PHP这套应用开发解决方案有了大致的了解.接下来介绍"如何学&quo ...

  5. Android 路由框架ARouter最佳实践

    一.功能介绍 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支 ...

  6. Android组件化方案最佳实践

    舞动着键盘和鼠标,我誓言要把这个世界写的明明白白 本文出自门心叼龙的博客,属于原创类容,转载请注明出处.https://blog.csdn.net/geduo_83/article/details/8 ...

  7. Android端WEEX + HTTPDNS 最佳实践

    由于WebView并未暴露处设置DNS的接口,因而在WebView场景下使用HttpDns存在很多无法限制,但如果接入WEEX,则可以较好地植入HTTPDNS,本文主要介绍在WEEX场景下接入HTTP ...

  8. android+php最佳实践视频,Android和PHP开发最佳实践 PDF 第2版

    php服务器,java服务器,android,ios开发兼容的3des加密解密, php ?phpclass DES3 {var $key = "my.oschina.net/penngo? ...

  9. Android应用性能优化最佳实践.2.3 布局优化

    2.3 布局优化 布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h相关,其时间复杂度为O(h),如果层级太深,每增加一 ...

  10. 带你学开源项目:Meizhi Android之RxJava Retrofit最佳实践

    如果你对开源项目分析感兴趣,欢迎加入我们的android-open-source-project-cracking 原创地址:http://www.jianshu.com/p/47e72693a302 ...

最新文章

  1. 用matlab画曲顶柱体费用数据,数值积分的matlab实现
  2. XDP/eBPF — BPF
  3. 小伙伴们惊呆了!10行 JavaScript 实现文本编辑器
  4. 从零开始玩转JMX(二)——Condition
  5. php中如何将验证码放入页面,如何在php中生成验证码图片
  6. dw连接服务器文档类型,dw怎么连接服务器的数据库
  7. dbcp连接池配置详解_JDBC第四篇【数据库连接池、DbUtils框架、分页】(修订版)
  8. python关键词共现_python 共现矩阵的实现
  9. Charles使用备注[1]
  10. 系统crontab指令
  11. 计算机组成原理微指令cpth,计算机组成原理(西安理工大学)实验二 CPTH模型机综合实验——微控制器实验.doc...
  12. 华为 交换机 配置STP
  13. 2022李宏毅第14讲---机器终身学习(Life Long Learning)
  14. JAVA学习homework的Car、Bus、motoVehicle
  15. GoogleHacking
  16. 智慧路灯杆网关的备用网络方案
  17. 开发者收到“加料”的假 Offer,害上家被盗近 6.25 亿美元!
  18. 谷歌字体fonts.googleapis.com等打开很慢解决方案
  19. 复购几乎为0的产品,怎么做线上推广?
  20. 什么是PEPPOL BIS?

热门文章

  1. Scala基础(四)
  2. 【钉钉-场景化能力包】IoT物联网设备协同
  3. PHP实现手机号或身份证号中间几位变*
  4. IBM李永辉:从人工智能到大数据的终点
  5. 北上资金 python_股票数据抓取——北上基金持股数据(selenium抓取数据),爬取,之,北向,资金,通过...
  6. 新浪开放平台:解决获取access_token抛 21323 异常,以及接口调用
  7. deepin切换root
  8. H5页面调起关注微信公众号的方法
  9. 零基础使用Xmind
  10. Android-布局 协调CoorinatorLayout