Android 绘图时实现双缓冲
一、双缓冲技术原理:
在内存中创建一片内存区域,把将要绘制的图片预先绘制到内存中,在绘制显示的时候直接获取缓冲区的图片进行绘制。更具体一点来说:先通过setBitmap方法将要绘制的所有的图形绘制到一个Bitmap上也就是先在内存空间完成,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。
二、双缓冲技术出现的缘由
当一个动画争先显示时,程序又在改变它,前面的画面还没显示完,程序又要求重新绘制,这样屏幕就会不停闪烁。为了避免闪烁,使绘制的内容有一个平滑的过度,所以就出现了双缓冲技术——》将要处理的图片都放在内存中处理好后,再将其一次性显示到屏幕上。这样出来的就是完整的图像,不会出现闪烁现象。
二、双缓冲技术的优缺点
优点:
1.绘制过程中一般不会出现闪烁现象,能使动画平滑过度。
2.高效,将图像一次性绘制到屏幕上比一次一次的绘制要高效的多。
缺点:
当图片过大时会严重的消耗内存
三、实现双缓冲的步骤
1.创建一片内存区域用于存放目标Bitmap
// 创建一个200*200的缓冲区
bitmapBuffer = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
2.设置目标内容绘制到缓冲区
// 设置将目标内容绘制在“缓冲区”
canvas.setBitmap(bitmapBuffer);
3.把将要绘制的图片绘制到缓冲区
// 把将要绘制的图片绘制到缓冲区
canvas.drawBitmap(bitmap, 0, 0, paint);
4.在onDraw方法中将缓冲区中的内容绘制到屏幕上
//将缓冲区的图片绘制到屏幕上
canvas.drawBitmap(bitmapBuffer, 0,0, paint);
四、双缓冲技术的实现代码:备注一下,其实SurfaceView和GLSurfaceView已经实现了双缓冲技术,建议在做动画和游戏时使用这两个view
1.DoubleBufferingView.java
package cn.yw.lib.doublebuffering; import cn.yw.lib.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
import android.view.View; /**
* 双缓冲View
*
* @author yw-tony
*
*/
public class DoubleBufferingView extends View implements Runnable {
private Bitmap bitmap = null;
private Paint paint = null;
// 创建一个Bitmap缓冲区
private Bitmap bitmapBuffer;
private Canvas canvas;
public boolean flag = true;// 线程结束标记,默认线程是开启的 public DoubleBufferingView(Context context) {
super(context);
initBuffering(context);
// 开启线程进行图片绘制
new Thread(this).start();
} /**
* 初始化缓冲区
*/
private void initBuffering(Context context) {
// 装载资源
bitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.ic_launcher);
// 创建一个200*200的缓冲区
bitmapBuffer = Bitmap.createBitmap(200, 200, Config.ARGB_8888);
canvas = new Canvas();
// 设置将目标内容绘制在“缓冲区”
canvas.setBitmap(bitmapBuffer);
// 实例化一个画笔
paint = new Paint();
// 把将要绘制的图片绘制到缓冲区
canvas.drawBitmap(bitmap, 0, 0, paint);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 将缓冲区的图片绘制到屏幕上
canvas.drawBitmap(bitmapBuffer, 0, 0, paint);
Log.e("draw", "正在努力绘制!");
} @Override
public void run() {
while (flag) {
try {
postInvalidate();// 更新View界面
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
} }
2.DoubleBufferingActivity.java
package cn.yw.lib.doublebuffering; import android.app.Activity;
import android.os.Bundle; /**
* 测试双缓冲
*
* @author yw-tony
*
*/
public class DoubleBufferingActivity extends Activity {
private DoubleBufferingView bufferView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bufferView = new DoubleBufferingView(this);
setContentView(bufferView);
} // 当用户按下回退键时结束线程
@Override
public void onBackPressed() {
super.onBackPressed();
bufferView.flag = false;
}
}
Android 绘图时实现双缓冲的更多相关文章
- 【MFC】MFC绘图不闪烁——双缓冲技术
MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33| 分类: VC|举报|字号 订阅 [转自:http://blog.163.com/yuanlong_zheng@126/ ...
- VC 绘图,使用双缓冲技术实现
VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...
- Android开发之用双缓冲技术绘图
双缓冲技术主要用在画图,动画效果上,其原理就是:将资源先载入到缓冲区,然后再将缓冲区整个载入到View上面去. 双缓冲技术可以有效防止闪烁,提高显示质量. DrawView.java: package ...
- win32下的双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- MFC中的双缓冲技术(解决绘图闪烁问题)
转自 MFC绘图不闪烁——双缓冲技术[转] 在VC/MFC用CDC绘图时,频繁的刷新,屏幕会出现闪烁的现象,CPU时间占用率相当高,绘图效率极低,很容易出现程序崩溃. 所谓双缓冲技术,下面是百度百科的 ...
- Win32下双缓冲绘图技术
一:双缓冲原理 为了解决窗口刷新频率过快所带来的闪烁问题,利用双缓冲技术进行绘图.所谓双缓冲技术,就是将资源加载到内存,然后复制内存数据到设备DC(这个比较快),避免了直接在设备DC上绘图(这个比较慢 ...
- Qt组件中的双缓冲无闪烁绘图
双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...
- VC使用双缓冲制作绘图控件
最近用VC做了一个画图的控件.控件在使用的时候遇到点问题.在控件里画了图之后切换到其他页面,等再切换回来的时候,发现控件里画的图都不见了.这是因为VC里面,当缩小.遮挡页面后客户区域就会失效,当再次显 ...
- [Android学习笔记]双缓冲绘图技术
双缓冲技术绘图: 什么情况下产生的双缓冲技术?当数据量很大时,绘图可能需要花费很长的时间,这样屏幕就会出现卡顿,闪烁等现象. 什么是双缓冲技术?双缓冲是在内存中创建一个与屏幕绘制区域一致的对象,先将图 ...
随机推荐
- Spring Data Solr —— 快速入门
Solr是基于Lucene(全文检索引擎)开发,它是一个独立系统,运行在Tomcat或Jetty(solr6以上集成了jetty,无需再部署到servlet容器上),但其原生中文的分词词功能不行,需要 ...
- 初识Nosql
ref:http://www.runoob.com/mongodb/nosql.html https://blog.csdn.net/testcs_dn/article/details/512258 ...
- POJ2478(SummerTrainingDay04-E 欧拉函数)
Farey Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16927 Accepted: 6764 D ...
- python-命令模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 命令在发送方被激活,而在接收方被响应.一个对象既可以作为命令的发送方,也可以作为 ...
- VMware部署ubuntu后开机提示piix4_smbus: Host SMBus controller not enabled!
在虚拟机部署ubuntu10.04-server,每次启动完成之后,出现“piix4_smbus0000:00:07.3: Host SMBus controller not enabled!”提示信 ...
- C# 字符串的操作
var tStr = "0|1:开门|2:关门|3:门检失败|4:开门|5:开门|6:关门"; ).Split(], s.Split(]).Replace(").Repl ...
- 关于MSCOMM.OCX无法正常注册的问题解决
[问题] 关于“Component'MSCOMM32.OCX'or one of its dependencies not correctly registered: afole is missing ...
- MySQL数据行溢出的深入理解
一.从常见的报错说起 故事的开头我们先来看一个常见的sql报错信息: 相信对于这类报错大家一定遇到过很多次了,特别对于OMG这种已内容生产为主要工作核心的BG,在内容线的存储中,数据大一定是个绕不开的 ...
- 关联与下钻:快速定位MySQL性能瓶颈的制胜手段
本文根据DBAplus社群[2018年1月6日北京开源与架构技术沙龙]现场演讲内容整理而成. 讲师介绍 李季鹏 新炬网络数据库专家 专注于MySQL数据库性能管理及相关解决方案,目前主要从事MySQL ...
- centos7 修改中文字符集
CentOS 7字符集的问题与6有点区别,会出现下面问题,查看是中文,vi进入就变成乱码了 生产中修改配置文件 [root@ce1d2002a999 ~]# cat /etc/locale.con ...