Android游戏开发之SurfaceView的使用-android学习之旅(五)
SurfaceView和View的区别
View是在ui主线程中,直接响应用户的操作,以及任务的分发,但是任务比较复杂会出现阻塞。
SurfaceView则不会出现这种问题,以为它直接从内存等取得图像,更为重要的是,SurfaceView可以通过主线程之外的线程来改变Ui。
使用
对于ui的更新分为主动更新和被动更新,对于被动更新,是通过时间出发控件的更新,频率一般比较低,所以倾向选择View来完成。
对于主动更新,更新频率较快,比如定时器更新画面,一版会采取SurfaceView。
实例代码:
public class MyView extends SurfaceView implements SurfaceHolder.Callback{
public MyView(Context context) {
super(context);
getHolder().addCallback(this);
}
public void draw(){
//锁定画布
Canvas canvas = getHolder().lockCanvas();
//结束之后记得解锁画布
getHolder().unlockCanvasAndPost(canvas);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
用SuifaceView绘制简单图形
绘制了一个红色的正方形:
public class MyView extends SurfaceView implements SurfaceHolder.Callback{
private Paint paint = null;
public MyView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.RED);
getHolder().addCallback(this);
}
public void draw(){
Canvas canvas = getHolder().lockCanvas();
canvas.drawColor(Color.WHITE);
canvas.drawRect(0, 0, 100, 100, paint);
getHolder().unlockCanvasAndPost(canvas);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
draw();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
注意一定要在surfaceCreated方法之后开始绘制,一定要在surfaceDestroyed方法之前结束绘制。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。