转自:http://blog.csdn.net/liubingzhao/article/details/5563113

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

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

先贴出View类代码:

  1. packagecom.lbz.pack.test;
  2. importandroid.content.Context;
  3. importandroid.graphics.Bitmap;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Bitmap.Config;
  7. importandroid.graphics.drawable.BitmapDrawable;
  8. importandroid.view.KeyEvent;
  9. importandroid.view.MotionEvent;
  10. importandroid.view.View;
  11. publicclassGameViewextendsViewimplementsRunnable
  12. {
  13. /*声明Bitmap对象*/
  14. BitmapmBitQQ=null;
  15. PaintmPaint=null;
  16. /*创建一个缓冲区*/
  17. BitmapmSCBitmap=null;
  18. /*创建Canvas对象*/
  19. CanvasmCanvas=null;
  20. publicGameView(Contextcontext)
  21. {
  22. super(context);
  23. /*装载资源*/
  24. mBitQQ=((BitmapDrawable)getResources().getDrawable(R.drawable.qq)).getBitmap();
  25. /*创建屏幕大小的缓冲区*/
  26. mSCBitmap=Bitmap.createBitmap(320,480,Config.ARGB_8888);
  27. /*创建Canvas*/
  28. mCanvas=newCanvas();
  29. /*设置将内容绘制在mSCBitmap上*/
  30. mCanvas.setBitmap(mSCBitmap);
  31. mPaint=newPaint();
  32. /*将mBitQQ绘制到mSCBitmap上*/
  33. mCanvas.drawBitmap(mBitQQ,0,0,mPaint);
  34. /*开启线程*/
  35. newThread(this).start();
  36. }
  37. publicvoidonDraw(Canvascanvas)
  38. {
  39. super.onDraw(canvas);
  40. /*将mSCBitmap显示到屏幕上*/
  41. canvas.drawBitmap(mSCBitmap,0,0,mPaint);
  42. }
  43. //触笔事件
  44. publicbooleanonTouchEvent(MotionEventevent)
  45. {
  46. returntrue;
  47. }
  48. //按键按下事件
  49. publicbooleanonKeyDown(intkeyCode,KeyEventevent)
  50. {
  51. returntrue;
  52. }
  53. //按键弹起事件
  54. publicbooleanonKeyUp(intkeyCode,KeyEventevent)
  55. {
  56. returnfalse;
  57. }
  58. publicbooleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent)
  59. {
  60. returntrue;
  61. }
  62. /**
  63. *线程处理
  64. */
  65. publicvoidrun()
  66. {
  67. while(!Thread.currentThread().isInterrupted())
  68. {
  69. try
  70. {
  71. Thread.sleep(100);
  72. }
  73. catch(InterruptedExceptione)
  74. {
  75. Thread.currentThread().interrupt();
  76. }
  77. //使用postInvalidate可以直接在线程中更新界面
  78. postInvalidate();
  79. }
  80. }
  81. }

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. runOnUiThread()方法
  3. 异常:ava.lang. NoClassDefFoundError: android .os.AsyncTask
  4. Android(安卓)Window的添加和显示过程
  5. Android调用webservice接口
  6. Android-Universal-Image-Loader 源码解读
  7. Android面试基础题总结二
  8. Android视图加载流程(3)之ViewRootImpl的UI刷新机制
  9. Android(安卓)P wakeup 亮屏流程

随机推荐

  1. 在android中使用HttpURLConnection进行文
  2. How to destroy an Activity in android
  3. To use MuPDF source code in Android
  4. Android(安卓)获得屏幕分辨率
  5. Android(安卓)判断SIM卡属于哪个移动运营
  6. CMAKE 在Linux下 构建android 编译、打包
  7. android stuido ndk 开发
  8. Process 'command 'C:\zssinstallsoft\
  9. android 中让activity全屏幕显示
  10. Android学习中遇到的问题及解决方案