因为上课要PPT汇报,我自己做了一个总结,现在把它放上来,下次容易找。
View是在UI的主线程中更新画面,而SurfaceView是在一个新线程中更新画面。View的特性决定了其不适合做动画,因为如果更新画面时间过长,那么主UI线程就会被正在画的函数阻塞。所以Android中通常用SurfaceView显示动画效果。
在对SurfaceView进行操作前Android为我们提供了一个十分好用的接口:SurfaceHolder.Callback接口。
SurfaceHolder.Callback接口的三个抽象方法是SurfaceView的三个生命周期
1.abstractvoidsurfaceChanged(SurfaceHolderholder, int format, int width, int height)
This is called immediatelyafter any structural changes (format or size) have been made to thesurface.
2.abstractvoidsurfaceCreated(SurfaceHolderholder)
This is called immediatelyafter the surface is first created.
3.abstractvoidsurfaceDestroyed(SurfaceHolderholder)
This is called immediatelybefore a surface is being destroyed注意:
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。
渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。可以在主线程之外的线程中向屏幕绘图,这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。
在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。
View是没有缓存机制的,每次绘图都是重新绘制
若要使用双缓冲机制的话。
1、自定义一个View 实现onDraw方法
2、调用这个方法,调用刷新onDraw()方法ssinView.postInvalidate();
3.需要格外创建一个Canvas,每次都
public voidonDraw(Canvascanvas){
if(x >=480){
x = 0;//清空画布
canvas.drawColor(Color.BLACK);//重新创建一个新的图
bitmap =Bitmap.createBitmap(480,104, Config.ARGB_8888); }
else{
//在缓冲中将之前的图绘制好,然后在真正的Canvas上绘制缓冲中的图Canvas c = newCanvas();
c.setBitmap(bitmap);
inty = (int)(A*Math.sin(x/180.0f*Math.PI)); System.out.println("==================y:"+y+"===x:"+x);c.drawPoint(x, y+A, paint); //canvas.save(); canvas.drawBitmap(bitmap, 0, 0,paint); x+=5; }}
Surfaceview实现了双缓冲技术
提供了一个类SurfaceHolder
1、继承SurfaceView实现Callback接口(在newSurfaceView的时候会自动回调)
2、刷新SurfaceView
// TODOAuto-generated method stub
super.run();
while(flag ==true){ //锁定,获得Canvas
Canvascanvas=surfaceHolder.lockCanvas(null);
onDraw(canvas);//释放锁 surfaceHolder.unlockCanvasAndPost(canvas);
asinSurfaceView.x+=5;
try{ Thread.sleep(sleepTime);
} catch(InterruptedExceptione)
{ // TODO Auto-generated catch block
e.printStackTrace();} }
Surfaceview控制Surface的绘制位置。
第一步:
继承SurfaceView并实现SurfaceHolder.Callback接口
第二步: SurfaceView.getHolder()获得SurfaceHolder对象
第三步:SurfaceHolder.addCallback(callback)添加回调函数
第四步:SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
第五步:Canvas绘画
第六步:SurfaceHolder.unlockCanvasAndPost(Canvascanvas)结束锁定画图,并提交改变,将图形显示。