SurfaceView类的使用
在android 中开发游戏,一般来说,或想写一个复杂一点的游戏,是必须用到
SurfaceView来开发的。
经过这一阵子对android的学习,我找到了自已在android 中游戏开发的误区,
不要老想着用Layout和view去实现,不要将某个游戏
中的对象做成一个组件来处理。应该尽量想着在Canvas(画布)中画出游戏戏中
的背景、人物、动画等...
SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图
层。SurfaceView是提供给需要直接画像素而不是使用
窗体部件的应用使用的。Android 图形系统中一个重要的概念和线索是surface。
View及其子类(如TextView, Button)
要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用
来管理view在surface上的绘图操作,如画点画线。
还要注意的是,使用它的时候,一般都是出现在最顶层的:Theviewhierarchy
will take care of correctly compositing
with the Surface any siblings of the SurfaceView that would normally
appear on top of it.
使用的SurfaceView的时候,一般情况下还要对其进行创建,销毁,改变时的情
况进行监视,这就要用到SurfaceHolder.Callback.
class BBatt extends SurfaceView implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder holder,int format,int
width,int height){}
//看其名知其义,在surface的大小发生改变时激发
public void surfaceCreated(SurfaceHolder holder){}
//同上,在创建时激发,一般在这里调用画图的线程。
public void surfaceDestroyed(SurfaceHolder holder) {}
//同上,销毁时激发,一般在这里将画图的线程停止、释放。
}
例子:
publicclassBBattextendsSurfaceViewimplementsSurfaceHolder.Callback,
OnKeyListener {
private BFairy bFairy;
private DrawThread drawThread;
public BBatt(Context context) {
super(context);
this.setLayoutParams(new wGroup.LayoutParams
(Global.battlefieldWidth,Global.battlefieldHeight));
this.getHolder().addCallback( this );
this.setFocusable( true );
this.setOnKeyListener( this );
bFairy = new BFairy(this.getContext());
}
public void surfaceChanged(SurfaceHolder holder,
int format,int width,int height) {
drawThread = new DrawThread(holder);
drawThread.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
if( drawThread != null ) {
drawThread.doStop();
while (true) try {
drawThread.join();
break ;
} catch(Exception ex) {}
}
}
public boolean onKey(View view, int keyCode, KeyEvent event) {}
}
实例2:用线程画一个蓝色的长方形。
原创力文档

文档评论(0)