初次接触android游戏,使用SurfaceView(View的一个子类)。发现了不少问题,作为新手和大家分享一下:
自定义类ChessView 继承SurfaceView 实现SurfaceHolder.Callback接口:
package com.backgammon;
import android.content.Context;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class ChessView extends SurfaceView implements SurfaceHolder.Callback {
public ChessView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
之后我以为还是靠View.onDraw()实现重画,于是自作聪明的欲对它进行onDraw重写:
package com.backgammon;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class ChessView extends SurfaceView implements SurfaceHolder.Callback {
private Paint paint;
public ChessView(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.getHolder().addCallback(this);
paint = new Paint();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
paint.setColor(Color.RED);
canvas.drawCircle(0, 0, 40, paint);
}
}
在onDraw(Canvas canvas)方法中画一个大红色的圆。
在MainActivity中实例化这个类,我以为就能看到预期的红圆,结果--------没有。
百度之 http://topic.csdn.net/u/20101125/11/d5246218-0c86-45cc-808b-9cfd774880ff.html,原来SurfaceView 就算重写了onDraw函数也不会自动调用的。。。。。。。
好吧再一百度,
synchronized (mSurfaceHolder) { //绘制过程,可能带来同步方面的问题,加锁
/**拿到当前画布 然后锁定**/
mCanvas =mSurfaceHolder.lockCanvas();
Draw();
/**绘制结束后解锁显示在屏幕上**/
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
其中Draw就是我们的画图操作了。
于是写一个doDraw()画图方法:
package com.backgammon;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class ChessView extends SurfaceView implements SurfaceHolder.Callback {
private Paint paint;
public ChessView(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.getHolder().addCallback(this);
paint = new Paint();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
paint.setColor(Color.RED);
canvas.drawCircle(0, 0, 40, paint);
}
public void doDraw(){
Canvas canvas = this.getHolder().lockCanvas();
onDraw(canvas);
this.getHolder().unlockCanvasAndPost(canvas);
}
}
按理说应该可以了吧,需要重绘的时候调用这个doDraw函数就可以了。
可是,我又遇到了另外一个问题,限于篇幅,请关注下一篇~