Android(安卓)SurfaceView 双缓冲机制
16lz
2021-01-26
转自:http://blog.csdn.net/liubingzhao/article/details/5563113
Android中的SurfaceView类就是双缓冲机制。因此,开发游戏时尽量使用SurfaceView而不要使用View,这样的话效率较高,而且SurfaceView的功能也更加完善。为了更容易的了解双缓冲技术,下面介绍用View实现双缓冲的方法。
先概述一下,双缓冲的核心技术就是先通过setBitmap方法将要绘制的所有的图形会知道一个Bitmap上,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。具体的实现代码如下:
先贴出View类代码:
- packagecom.lbz.pack.test;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Canvas;
- importandroid.graphics.Paint;
- importandroid.graphics.Bitmap.Config;
- importandroid.graphics.drawable.BitmapDrawable;
- importandroid.view.KeyEvent;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- publicclassGameViewextendsViewimplementsRunnable
- {
- /*声明Bitmap对象*/
- BitmapmBitQQ=null;
- PaintmPaint=null;
- /*创建一个缓冲区*/
- BitmapmSCBitmap=null;
- /*创建Canvas对象*/
- CanvasmCanvas=null;
- publicGameView(Contextcontext)
- {
- super(context);
- /*装载资源*/
- mBitQQ=((BitmapDrawable)getResources().getDrawable(R.drawable.qq)).getBitmap();
- /*创建屏幕大小的缓冲区*/
- mSCBitmap=Bitmap.createBitmap(320,480,Config.ARGB_8888);
- /*创建Canvas*/
- mCanvas=newCanvas();
- /*设置将内容绘制在mSCBitmap上*/
- mCanvas.setBitmap(mSCBitmap);
- mPaint=newPaint();
- /*将mBitQQ绘制到mSCBitmap上*/
- mCanvas.drawBitmap(mBitQQ,0,0,mPaint);
- /*开启线程*/
- newThread(this).start();
- }
- publicvoidonDraw(Canvascanvas)
- {
- super.onDraw(canvas);
- /*将mSCBitmap显示到屏幕上*/
- canvas.drawBitmap(mSCBitmap,0,0,mPaint);
- }
- //触笔事件
- publicbooleanonTouchEvent(MotionEventevent)
- {
- returntrue;
- }
- //按键按下事件
- publicbooleanonKeyDown(intkeyCode,KeyEventevent)
- {
- returntrue;
- }
- //按键弹起事件
- publicbooleanonKeyUp(intkeyCode,KeyEventevent)
- {
- returnfalse;
- }
- publicbooleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent)
- {
- returntrue;
- }
- /**
- *线程处理
- */
- publicvoidrun()
- {
- while(!Thread.currentThread().isInterrupted())
- {
- try
- {
- Thread.sleep(100);
- }
- catch(InterruptedExceptione)
- {
- Thread.currentThread().interrupt();
- }
- //使用postInvalidate可以直接在线程中更新界面
- postInvalidate();
- }
- }
- }
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- runOnUiThread()方法
- 异常:ava.lang. NoClassDefFoundError: android .os.AsyncTask
- Android(安卓)Window的添加和显示过程
- Android调用webservice接口
- Android-Universal-Image-Loader 源码解读
- Android面试基础题总结二
- Android视图加载流程(3)之ViewRootImpl的UI刷新机制
- Android(安卓)P wakeup 亮屏流程