Surface View无法正确重绘rect

时间:2014-12-29 10:44:51

标签: android view surfaceview

我试图从左到右在屏幕上漫游。在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向右增长,在覆盖屏幕后创建一条线。有任何想法吗?谢谢你的努力!

1 个答案:

答案 0 :(得分:0)

我可以看到您的代码存在一些问题:

  1. Android不会为您清除屏幕。您需要通过擦除屏幕来开始每个绘图会话,否则您将看到以前呈现的内容。这就是为什么你会在屏幕上画一条线。此外,输出表面可能是双缓冲或三缓冲,因此在某些情况下它实际上会闪烁"如果你没有删除它,你可以动画。

  2. 您没有在Surface上绘图。 SurfaceView有两个部分,Surface和View。通过覆盖onDraw()您正在使用视图,就像使用custom view一样,除了使用SurfaceView您浪费系统资源。如果要在Surface上绘制,则需要从SurfaceHolder获取Canvas。 (如果在View上绘图,可以使用它,这样你就可以利用硬件加速。)

  3. 另请参阅图形架构文档的Surface lifecycle部分。