一、双缓冲技术原理:

  在内存中创建一片内存区域,把将要绘制的图片预先绘制到内存中,在绘制显示的时候直接获取缓冲区的图片进行绘制。更具体一点来说:先通过setBitmap方法将要绘制的所有的图形绘制到一个Bitmap上也就是先在内存空间完成,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。

二、双缓冲技术出现的缘由

  当一个动画争先显示时,程序又在改变它,前面的画面还没显示完,程序又要求重新绘制,这样屏幕就会不停闪烁。为了避免闪烁,使绘制的内容有一个平滑的过度,所以就出现了双缓冲技术——》将要处理的图片都放在内存中处理好后,再将其一次性显示到屏幕上。这样出来的就是完整的图像,不会出现闪烁现象。

二、双缓冲技术的优缺点

  优点:

    1.绘制过程中一般不会出现闪烁现象,能使动画平滑过度。

    2.高效,将图像一次性绘制到屏幕上比一次一次的绘制要高效的多。

  缺点:

    当图片过大时会严重的消耗内存

三、实现双缓冲的步骤

  1.创建一片内存区域用于存放目标Bitmap

  

  1.     // 创建一个200*200的缓冲区
  2. bitmapBuffer = Bitmap.createBitmap(200, 200, Config.ARGB_8888);

  2.设置目标内容绘制到缓冲区

  1.     // 设置将目标内容绘制在“缓冲区”
  2. canvas.setBitmap(bitmapBuffer);

  3.把将要绘制的图片绘制到缓冲区 

  1.     // 把将要绘制的图片绘制到缓冲区
  2. canvas.drawBitmap(bitmap, 0, 0, paint);

  4.在onDraw方法中将缓冲区中的内容绘制到屏幕上

  

  1.     //将缓冲区的图片绘制到屏幕上
  2. canvas.drawBitmap(bitmapBuffer, 0,0, paint);

四、双缓冲技术的实现代码:备注一下,其实SurfaceView和GLSurfaceView已经实现了双缓冲技术,建议在做动画和游戏时使用这两个view

  1.DoubleBufferingView.java

  1. package cn.yw.lib.doublebuffering;
  2.  
  3. import cn.yw.lib.R;
  4. import android.content.Context;
  5. import android.graphics.Bitmap;
  6. import android.graphics.Bitmap.Config;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.Canvas;
  9. import android.graphics.Paint;
  10. import android.util.Log;
  11. import android.view.View;
  12.  
  13. /**
  14. * 双缓冲View
  15. *
  16. * @author yw-tony
  17. *
  18. */
  19. public class DoubleBufferingView extends View implements Runnable {
  20. private Bitmap bitmap = null;
  21. private Paint paint = null;
  22. // 创建一个Bitmap缓冲区
  23. private Bitmap bitmapBuffer;
  24. private Canvas canvas;
  25. public boolean flag = true;// 线程结束标记,默认线程是开启的
  26.  
  27. public DoubleBufferingView(Context context) {
  28. super(context);
  29. initBuffering(context);
  30. // 开启线程进行图片绘制
  31. new Thread(this).start();
  32. }
  33.  
  34. /**
  35. * 初始化缓冲区
  36. */
  37. private void initBuffering(Context context) {
  38. // 装载资源
  39. bitmap = BitmapFactory.decodeResource(context.getResources(),
  40. R.drawable.ic_launcher);
  41. // 创建一个200*200的缓冲区
  42. bitmapBuffer = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
  43. canvas = new Canvas();
  44. // 设置将目标内容绘制在“缓冲区”
  45. canvas.setBitmap(bitmapBuffer);
  46. // 实例化一个画笔
  47. paint = new Paint();
  48. // 把将要绘制的图片绘制到缓冲区
  49. canvas.drawBitmap(bitmap, 0, 0, paint);
  50. }
  51.  
  52. @Override
  53. protected void onDraw(Canvas canvas) {
  54. super.onDraw(canvas);
  55. // 将缓冲区的图片绘制到屏幕上
  56. canvas.drawBitmap(bitmapBuffer, 0, 0, paint);
  57. Log.e("draw", "正在努力绘制!");
  58. }
  59.  
  60. @Override
  61. public void run() {
  62. while (flag) {
  63. try {
  64. postInvalidate();// 更新View界面
  65. Thread.sleep(1000);
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. }
  71.  
  72. }

2.DoubleBufferingActivity.java

  

  1. package cn.yw.lib.doublebuffering;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5.  
  6. /**
  7. * 测试双缓冲
  8. *
  9. * @author yw-tony
  10. *
  11. */
  12. public class DoubleBufferingActivity extends Activity {
  13. private DoubleBufferingView bufferView;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. bufferView = new DoubleBufferingView(this);
  19. setContentView(bufferView);
  20. }
  21.  
  22. // 当用户按下回退键时结束线程
  23. @Override
  24. public void onBackPressed() {
  25. super.onBackPressed();
  26. bufferView.flag = false;
  27. }
  28. }

  

Android 绘图时实现双缓冲的更多相关文章

  1. 【MFC】MFC绘图不闪烁——双缓冲技术

    MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/yuanlong_zheng@126/ ...

  2. VC 绘图,使用双缓冲技术实现

    VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...

  3. Android开发之用双缓冲技术绘图

    双缓冲技术主要用在画图,动画效果上,其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁,提高显示质量. DrawView.java: package ...

  4. win32下的双缓冲绘图技术

    一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...

  5. MFC中的双缓冲技术(解决绘图闪烁问题)

    转自 MFC绘图不闪烁——双缓冲技术[转] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的 ...

  6. Win32下双缓冲绘图技术

    一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...

  7. Qt组件中的双缓冲无闪烁绘图

      双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...

  8. VC使用双缓冲制作绘图控件

    最近用VC做了一个画图的控件.控件在使用的时候遇到点问题.在控件里画了图之后切换到其他页面,等再切换回来的时候,发现控件里画的图都不见了.这是因为VC里面,当缩小.遮挡页面后客户区域就会失效,当再次显 ...

  9. [Android学习笔记]双缓冲绘图技术

    双缓冲技术绘图: 什么情况下产生的双缓冲技术?当数据量很大时,绘图可能需要花费很长的时间,这样屏幕就会出现卡顿,闪烁等现象. 什么是双缓冲技术?双缓冲是在内存中创建一个与屏幕绘制区域一致的对象,先将图 ...

随机推荐

  1. HDU1698(KB7-E 线段树)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. zsh: command not found cnpm,gulp等命令在zsh终端上报错的问题

    以cnpm包为例,使用 npm install -g cnpm 创建了cnpm包.而在zsh终端上运行cnpm,出现 zsh: command not found: cnpm 的报错.同样的,gulp ...

  3. 【代码笔记】iOS-导航条的标题(label)

    一,效果图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...

  4. HTML5+CSS (简易nav设计)

    HTML部分: <!DOCTYPE html><html> <head> <title></title> <meta charset= ...

  5. 解决stackoverflow打开缓慢的问题

    一.原因: 因为stackoverflow用的是谷歌的api,在国内谷歌是被禁用的,所以才会打开缓慢,并不是stackverflow被墙 二.解决方法: 1.如果你正在使用的是火狐浏览器,那么请按照下 ...

  6. Difference between nn.softmax & softmax_cross_entropy_with_logits & softmax_cross_entropy_with_logits_v2

    nn.softmax 和 softmax_cross_entropy_with_logits 和 softmax_cross_entropy_with_logits_v2 的区别   You have ...

  7. android 解决连接电视机顶盒失败的方法

    今天在开发过程中,需要连接海美迪的电视盒子,这个盒子是基于android6.0的版本,之前连接其它电视盒子都正常,当输入 adb -s xxxx shell后,盒子连接失败,日志如下: error: ...

  8. windows 服务器远程桌面 你的凭据不工作

    一.问题描述   通过windows 远程桌面连接服务器时,输入正确的用户名和密码,点击连接按钮时,提示“你的凭据不工作”,但是其他个别电脑可以通过远程桌面远程到目标服务器.问题描述如下图所示: 二. ...

  9. leveldb源码分析--SSTable之TableBuilder

    上一篇文章讲述了SSTable的格式以后,本文结合源码解析SSTable是如何生成的. void TableBuilder::Add(const Slice& key, const Slice ...

  10. CSS| 解决子级用css float浮动 而父级div没高度不能自适应高度

    解决子级用css float浮动 而父级div没高度不能自适应高度 解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 最外层 ...