双缓冲
(一)为了防止动画闪烁而实现的一种多线程应用,主要原理:当一个动画争先显示时,程序又在改变它,前面还没显示完,程序又请求重新绘制,屏幕就会不停闪烁。为了避免闪烁,可以使用双缓冲技术,将要处理的图片在内存中处理好之后,再将其显示到屏幕上。这样显示出来是完整的图象,不会出现闪烁现象。
(二)在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:
(1)在内存中创建与画布一致的缓冲区
(2)在缓冲区画图
(3)将缓冲区位图拷贝到当前画布上
(4)释放内存缓冲区
package com.android.google.example;
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();
}
}
}