1.view
invalidate()
invalidate(Rect rect) 更新Rect区域
invalidate(l, t, r, b) 更新指定矩形区域
- public
void onDraw(Canvas canvas){ -
DosomeThing(); -
invalidate(); - }
第二种:使用postInvalidate();方法来刷新屏幕 ,调用后它会用handler通知UI线程重绘屏幕,我们可以 new
postInvalidate(left, top, right, bottom) 方法 通过UI线程来刷新规定矩形区域。
- @Override
- public
void run() { -
while (mIsRunning) { -
try { -
Thread.sleep(100); -
postInvalidate(); -
} catch (InterruptedException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} -
} - }
View中用到的双缓冲技术
首先我们需要创建一张屏幕大小的缓冲图片,我说一下第三个参数 ARGB 分别代表的是 透明度
Bitmap.Config
Bitmap.Config
Bitmap.Config
一般情况下我们使用ARGB_8888 因为它的效果是最好了 当然它也是最占内存的。
- mBufferBitmap
= Bitmap.createBitmap(mScreenWidth,mScreenHeight,Config.ARGB_8888);
创建一个缓冲的画布,将内容绘制在缓冲区mBufferBitmap中
- Canvas
mCanvas = new Canvas(); - mCanvas.setBitmap(mBufferBitmap);
最后一次性的把缓冲区mBufferBitmap绘制在屏幕上,怎么样 简单吧 呵呵。
- @Override
- protected
void onDraw(Canvas canvas) { -
-
-
DrawMap(mCanvas,mPaint,mBitmap); -
-
RenderAnimation(mCanvas); -
-
UpdateAnimation(); -
-
-
if(isBorderCollision) { -
DrawCollision(mCanvas,"与边界发生碰撞"); -
} -
-
if(isAcotrCollision) { -
DrawCollision(mCanvas,"与实体层发生碰撞"); -
} -
if(isPersonCollision) { -
DrawCollision(mCanvas,"与NPC发生碰撞"); -
} -
-
-
canvas.drawBitmap(mBufferBitmap, 0,0, mPaint); -
super.onDraw(canvas); - }
2.SurfaceView
代码中是如何实现SurfaceView
首先需要实现 Callback 接口 与Runnable接口
- public
class AnimView extends SurfaceView implements Callback,Runnable
获取当前mSurfaceHolder 并且把它加到CallBack回调函数中
- SurfaceHolder
mSurfaceHolder = getHolder(); - mSurfaceHolder.addCallback(this);
- @Override
- public
void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, -
int arg3) { -
// surfaceView的大小发生改变的时候 -
- }
-
- @Override
- public
void surfaceCreated(SurfaceHolder arg0) { -
-
mIsRunning = true; -
mThread = new Thread(this); -
mThread.start(); - }
-
- @Override
- public
void surfaceDestroyed(SurfaceHolder arg0) { -
// surfaceView销毁的时候 -
mIsRunning = false; - }
在游戏主线程循环中在绘制开始 先拿到画布canvas 并使用mSurfaceHolder.lockCanvas()锁定画布,等绘制结束以后 使用mSurfaceHolder.unlockCanvasAndPost(mCanvas)解锁画布,
- @Override
- public
void run() { -
while (mIsRunning) { -
try { -
Thread.sleep(100); -
} catch (InterruptedException e) { -
// TODO Auto-generated catch block -
e.printStackTrace(); -
} -
-
//在这里加上线程安全锁 -
synchronized (mSurfaceHolder) { -
-
mCanvas =mSurfaceHolder.lockCanvas(); -
Draw(); -
-
mSurfaceHolder.unlockCanvasAndPost(mCanvas); -
} -
} - }
由此可见SurfaceView 属于主动刷新 ,重绘过程完全是在我们自己的线程中完成 , 由于游戏中肯定会执行各种绚丽的动画效果如果使用被动刷新的View就有可能就会阻塞UI线程,所以SurfaceView 更适合做游戏。
效果图