Android中双缓冲技术是游戏开发中的一个重要技术。主要原理:当一个动画争先显示时,程序又在改变它,前画面还没有显示完,程序又请求重新绘制,这样屏幕就会不停闪烁。为了避免闪烁,可以使用双缓冲技术,将要处理的图片都在内存中处理好之后,再将其显示到屏幕上。这样显示出来的总是完整的图像,不会出现闪烁现象。

从以前介绍过的内容中我们可以看出,Android中的SurfaceView类其实就是一个双缓冲机制。因此,开发游戏时可能会比较多地使用SurfaceView类来完成,这样效率更高,而且SurfaceView类的功能也更加完善。下面将主要介绍用View类实现双缓冲技术。先来看看通过双缓冲技术绘制的图像效果,如图5-17所示。

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 package com.yarin.android.Examples_05_12; 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(); } } }

自此,我们介绍完了Android的双缓冲技术,让你显示图片更加流畅。

更多相关文章

  1. Android UI 的更新及其线程模型
  2. Android多线程编程和线程池
  3. Android中的线程状态之AsyncTask详解
  4. Android任务、进程、线程的关系
  5. Android 主线程到底是什么、如何抛出ANR
  6. Android 的线程跟线程池
  7. Android 性能优化——通过线程提高性能

随机推荐

  1. Android基础之基本控件
  2. GoogleMap
  3. Android bt hid(bluedroid)和linux HID-sub
  4. Android存储权限
  5. 用PC应用程序通过USB读写Andriod里面的数
  6. Android 控件之DatePicker,TimePicker,Ca
  7. 解决Could not find method android() fo
  8. Android禁止横屏竖屏切换
  9. 改变android程序head样式
  10. android的Notification折叠