主要原理:当一个动画争先显示时,程序又在改变它,前画面还没有显示完,程序又请求重新绘制,这样屏幕就会不停闪烁。
为了避免闪烁,可以使用双缓冲技术,将要处理的图片都在内存中绘制好之后,再将其显示在屏幕上。这样显示出来的总是完整的图像,不会发生闪烁。
双缓冲的核心技术就是先通过setBitmap方法将要绘制的所有图形绘制到一个Bitmap上,然后再来调用drawBitmap方法绘制出这个Bitmap上,显示在屏幕上。
package ...;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
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(800,800, Bitmap.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);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}
//线程处理
public void run()
{
while(!Thread.currentThread().isInterrupted())
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
//使用postInvalidate可以直接在线程中更新界面
postInvalidate();
}
}
}