欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android双缓冲技术实例详解

程序员文章站 2022-05-27 10:22:45
android中的surfaceview类就是双缓冲机制。因此,在进行android游戏开发时应尽量使用surfaceview而不要使用view,这样的话效率较高,并且su...

android中的surfaceview类就是双缓冲机制。因此,在进行android游戏开发时应尽量使用surfaceview而不要使用view,这样的话效率较高,并且surfaceview的功能也更加完善。为了更容易的了解双缓冲技术,下面介绍用view实现双缓冲的方法。

在此需要说明一下,双缓冲的核心技术就是先通过setbitmap方法将要绘制的所有的图形绘制到一个bitmap上,然后再来调用drawbitmap方法绘制出这个bitmap,显示在屏幕上。其具体的实现代码如下:

先贴出view类代码:

package com.lbz.pack.test;

import android.content.context;
import android.graphics.bitmap;
import android.graphics.canvas;
import android.graphics.paint;
import android.graphics.bitmap.config;
import android.graphics.drawable.bitmapdrawable;
import android.view.keyevent;
import android.view.motionevent;
import android.view.view;
public class gameview extends view implements runnable
{
 /* 声明bitmap对象 */
 bitmap mbitqq = null;
 paint  mpaint = null;
 /* 创建一个缓冲区 */
 bitmap mscbitmap = null;
 /* 创建canvas对象 */
 canvas mcanvas = null;  
 public gameview(context context)
 {
 super(context);
 /* 装载资源 */
 mbitqq = ((bitmapdrawable) getresources().getdrawable(r.drawable.qq)).getbitmap();
 /* 创建屏幕大小的缓冲区 */
 mscbitmap=bitmap.createbitmap(320, 480, config.argb_8888); 
 /* 创建canvas */
 mcanvas = new canvas(); 
 /* 设置将内容绘制在mscbitmap上 */
 mcanvas.setbitmap(mscbitmap); 
 mpaint = new paint();
 /* 将mbitqq绘制到mscbitmap上 */
 mcanvas.drawbitmap(mbitqq, 0, 0, mpaint);
 /* 开启线程 */
 new thread(this).start();
 }
 public void ondraw(canvas canvas)
 {
 super.ondraw(canvas);
 /* 将mscbitmap显示到屏幕上 */
 canvas.drawbitmap(mscbitmap, 0, 0, mpaint);
 }
 // 触笔事件
 public boolean ontouchevent(motionevent event)
 {
 return true;
 }
 // 按键按下事件
 public boolean onkeydown(int keycode, keyevent event)
 {
 return true;
 }
 // 按键弹起事件
 public boolean onkeyup(int keycode, keyevent event)
 {
 return false;
 }
 public boolean onkeymultiple(int keycode, int repeatcount, keyevent event)
 {
 return true;
 }
 /**
 * 线程处理
 */
 public void run()
 {
 while (!thread.currentthread().isinterrupted())
 {
  try
  {
  thread.sleep(100);
  }
  catch (interruptedexception e)
  {
  thread.currentthread().interrupt();
  }
  //使用postinvalidate可以直接在线程中更新界面
  postinvalidate();
 }
 }
}