我试图从左到右在屏幕上漫游。在MyPaddle类中,X坐标在每个循环中递增。在SurfaceView中,我试图绘制rects,因此看起来它们在屏幕上徘徊。我的代码:
public GameView(Context context) {
super(context);
gameLoopThread = new GameLoopThread(this);
sc = (StartingClass) context;
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
gameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
}
@Override
protected void onDraw(Canvas canvas) {
PongPaddle myPaddle = sc.getMyPaddle();
PongPaddle compPaddle = sc.getCompPaddle();
paint.setColor(Color.WHITE);
paint.setStrokeWidth(0);
canvas.drawRect(Math.round(myPaddle.getCenterX()-sc.getPaddleWidth()/2), getHeight() -30, Math.round(myPaddle.getCenterX()+sc.getPaddleWidth()/2), getHeight(), paint);
canvas.drawRect(Math.round(compPaddle.getCenterX()-sc.getPaddleWidth()/2),0, Math.round(compPaddle.getCenterX()+sc.getPaddleWidth()/2), 30, paint);
// super.onDraw(canvas);
}
绘制了rects,但似乎屏幕未重置,但是rects被绘制在彼此之上。结果是rect向右增长,在覆盖屏幕后创建一条线。有任何想法吗?谢谢你的努力!
答案 0 :(得分:0)
我可以看到您的代码存在一些问题:
Android不会为您清除屏幕。您需要通过擦除屏幕来开始每个绘图会话,否则您将看到以前呈现的内容。这就是为什么你会在屏幕上画一条线。此外,输出表面可能是双缓冲或三缓冲,因此在某些情况下它实际上会闪烁"如果你没有删除它,你可以动画。
您没有在Surface上绘图。 SurfaceView有两个部分,Surface和View。通过覆盖onDraw()
您正在使用视图,就像使用custom view一样,除了使用SurfaceView您浪费系统资源。如果要在Surface上绘制,则需要从SurfaceHolder获取Canvas。 (如果在View上绘图,可以使用它,这样你就可以利用硬件加速。)
另请参阅图形架构文档的Surface lifecycle部分。