文档章节

双缓冲实现涂鸦view

jacky_123
 jacky_123
发布于 2015/03/03 14:26
字数 434
阅读 8
收藏 1
点赞 0
评论 0

所谓的双缓冲技术其实很简单,当程序需要在指定的view上进行绘制是,程序并不直接绘制到View组件上,而是先绘制到一个内存中的Bitmap中(这就是缓冲),等到Bitmap绘制好了,再一次性将Bitmap绘制到这个View组件上。

下面,定义了

cacheBitmap:该图片将作为缓冲区

cacheCanvas: 定义cacheBitmap上的Canvas对象

通过cacheCanvas = new Canvas(cacheBitmap)将两者练习到一起。

代码很简单,如下,不解释了

public class DrawView extends View
{
 float preX;
 float preY;
 private Path path;
 public Paint paint = null;
 // 定义一个内存中的图片,该图片将作为缓冲区
 Bitmap cacheBitmap = null;
 // 定义cacheBitmap上的Canvas对象
 Canvas cacheCanvas = null;
 public DrawView(Context context, AttributeSet set)
 {
  super(context, set);
  /**
   * 获取屏幕的宽高
   */
  WindowManager wm = (WindowManager) context
    .getSystemService(Context.WINDOW_SERVICE);
  DisplayMetrics outMetrics = new DisplayMetrics();
  wm.getDefaultDisplay().getMetrics(outMetrics);
  int screenWidth = outMetrics.widthPixels;
  int screenHeight = outMetrics.heightPixels;
  
  // 创建一个与该View相同大小的缓存区
  cacheBitmap = Bitmap.createBitmap(screenWidth, screenHeight,
    Config.ARGB_8888);
  // 设置cacheCanvas将会绘制到内存中的cacheBitmap上
  cacheCanvas = new Canvas(cacheBitmap);
  path = new Path();
  // 设置画笔的颜色
  paint = new Paint(Paint.DITHER_FLAG);
  paint.setColor(Color.RED);
  // 设置画笔风格
  paint.setStyle(Paint.Style.STROKE);
  paint.setStrokeWidth(1);
  // 反锯齿
  paint.setAntiAlias(true);
  paint.setDither(true);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event)
 {
  // 获取拖动事件的发生位置
  float x = event.getX();
  float y = event.getY();
  switch (event.getAction())
  {
   case MotionEvent.ACTION_DOWN:
    path.moveTo(x, y);
    preX = x;
    preY = y;
    break;
   case MotionEvent.ACTION_MOVE:
    path.quadTo(preX, preY, x, y);
    preX = x;
    preY = y;
    break;
   case MotionEvent.ACTION_UP:
    cacheCanvas.drawPath(path, paint); // ①
    path.reset();
    break;
  }
  /**
   * 通知view重绘可调用invalidate() UI线程中
   * 或者postInvalidate  非UI线程中
   */
  invalidate();
  // 返回true表明处理方法已经处理该事件
  return true;
 }
 @Override
 public void onDraw(Canvas canvas)
 {
  Paint bmpPaint = new Paint();
  // 将cacheBitmap绘制到该View组件上
  canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint); // ②
  // 沿着path绘制
  canvas.drawPath(path, paint);
 }
}

 

参考:疯狂android讲义 p355

        例子:HandDraw

© 著作权归作者所有

共有 人打赏支持
jacky_123
粉丝 3
博文 52
码字总数 26297
作品 0
南通
程序员
Android中UI(View)的刷新

看了很多资料,翻啊翻啊,似乎有些了解了。 Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。 现在可以尝试理解下面的模...

DreamWorker ⋅ 2010/10/30 ⋅ 4

Android-SurfaceView与SurfaceHolder对象

1、Android-SurfaceView与SurfaceHolder对象: http://blog.csdn.net/andyhuabing/article/details/7657069 2、Android学习之 VideoView,SurfaceView: http://blog.csdn.net/abidepan/arti......

当空皓月 ⋅ 2014/12/18 ⋅ 0

【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/331.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童 ⋅ 2012/03/19 ⋅ 0

Android 涂鸦最佳实践

Android中实现手势绘图一般都两种方式,一是直接在View上绘制,而是使用SurfaceView。两者还是有一些区别的,简单介绍下。View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函...

Jack_1900 ⋅ 2014/09/02 ⋅ 6

项目需求讨论:截图—涂鸦—分享

大家好,又到了新的一期项目需求分析。台下的观众举起手,让我看到你们。 同时我已经上传该项目:截屏及仿支付宝涂鸦功能 欢迎各位点个star哦。(⊙o⊙) 开始秋名山飘移之路 这个也是具体项目...

青蛙要fly ⋅ 2017/04/12 ⋅ 0

Android 带你撸一个好玩的 DoodleView(涂鸦)

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 最近项目中需要用到涂鸦的功能,在 Github 上搜了一圈也没找到适合的库,索性就自己撸一个出来,正好复习一下自定义 View 的知...

developerHaoz ⋅ 2017/07/14 ⋅ 0

Android App内截屏监控及涂鸦功能实现

Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操作时,将自动展示该截屏,并提供用户随意...

JackMeGo ⋅ 2017/04/14 ⋅ 0

Android 带你撸一个好玩的涂鸦 View

前言 最近项目中需要用到涂鸦的功能,在 Github 上搜了一圈也没找到适合的库,索性就自己撸一个出来,正好复习一下自定义 View 的知识。写完之后怎么可以自己藏着呢,当然得写篇博客分享给大...

developerHaoz ⋅ 2017/09/13 ⋅ 0

Android 返回前面的Activity时且它也能自动更新

1 引用函数 setResult和 onActivityResult处理机制 实现原理,在第二个Activity的返回事件中返回数据,第一个Activity中重构onActivityResult方法,在重构该方法的事件中,感觉返回的数据,做...

xiahuawuyu ⋅ 2012/12/06 ⋅ 0

Android:SurfaceView 的使用(附代码模板)

前言 摘自《Android群英传》 Android提供了View进行绘图处理,View可以满足大部分的绘图需求,但在某些时候也会心有余而力不足。我们知道,View通过刷新来重绘视图,Android 系统通过发出VSY...

涤生_Woo ⋅ 2017/05/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

关于线程的创建

转自自己的笔记: http://note.youdao.com/noteshare?id=87584d4874acdeaf4aa027bdc9cb7324&sub=B49E8956E145476191C3FD1E4AB40DFA 1.创建线程的方法 Java使用Thread类代表线程,所有的线程对......

MarinJ_Shao ⋅ 24分钟前 ⋅ 0

工厂模式学习

1. 参考资料 工厂模式-伯乐在线 三种工厂-思否 深入理解工厂模式 2. 知识点理解 2.1 java三种工厂 简单工厂 工厂模式 抽象工厂 2.2 异同点 逐级复杂 简单工厂通过构造时传入的标识来生产产品...

liuyan_lc ⋅ 36分钟前 ⋅ 0

Java NIO

1.目录 Java IO的历史 Java NIO之Channel Java NIO之Buffer Java NIO之Selector Java NIO之文件处理 Java NIO之Charset Java 可扩展IO 2.简介 “IO的历史”讲述了Java IO API从开始到现在的发...

士别三日 ⋅ 41分钟前 ⋅ 0

[Err] ORA-24344: success with compilation error

从txt文本复制出创建function的脚本,直接执行,然后报错:[Err] ORA-24344: success with compilation error。 突然发现脚本的关键字,居然不是高亮显示。 然后我把脚本前面的空格去掉,执行...

wenzhizhon ⋅ 50分钟前 ⋅ 0

Spring Security授权过程

前言 本文是接上一章Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实现得; 类图 调试过程 使用debug方式启动https://github.com/longfeizheng/logback该项目,...

hutaishi ⋅ 今天 ⋅ 0

HAProxy基于KeepAlived实现Web高可用及动静分离

前言 软件负载均衡一般通过两种方式来实现: 基于操作系统的软负载实现 基于第三方应用的软负载实现 LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。 ...

寰宇01 ⋅ 今天 ⋅ 0

微软自研处理器的小动作:已经开始移植其他平台的工具链

微软将 Windows 10 、Linux 以及工具链如 C/C++ 和 .NET Core 运行时库、Visual C++ 2017 命令行工具、RyuJIT 编辑器等移植到其自主研发的处理器架构 E2。微软还移植了广泛使用的 LLVM C/C++...

linux-tao ⋅ 今天 ⋅ 0

JS常见this指代总结

1. dom0级事件处理程序的回调函数内 2. dom2级事件处理程序的回调函数内 3. setTimeout 4. setInterval var test = { testfn: function () { console.log(this); }};...

静默行 ⋅ 今天 ⋅ 0

泛型的基本原理

泛型是 JDK1.5 的一个新特性,其实就是一个『语法糖』,本质上就是编译器为了提供更好的可读性而提供的一种小「手段」,虚拟机层面是不存在所谓『泛型』的概念的。 在我看来,『泛型』的存在...

沧海一刀 ⋅ 今天 ⋅ 0

学好Java只需要做到这8点,年薪30W很简单!文末福利赠送!

前言: 大道至简,所以扎实有用的方法,其实都是很简单的,难在踏踏实实的执行过程。今天为大家介绍的就是Java学习的8个看起来非常简单的方法,快学起来吧。 为什么要学习Java? Java是目前最...

java高级架构牛人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部