簡體   English   中英

Surface View無法正確重繪矩形

[英]Surface View not redrawing rect correctly

我試圖讓rect從左到右在屏幕上徘徊。 在MyPaddle類中,X坐標在每個循環中遞增。 在SurfaceView中,我試圖繪制矩形,因此它們似乎在屏幕上徘徊。 我的代碼:

    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);
}

繪制了rect,但似乎沒有重置屏幕,但是將rect繪制在彼此的頂部。 結果是矩形向右生長,在覆蓋屏幕之后創建了一條線。 有任何想法嗎? 多謝您的努力!

我可以看到您的代碼有幾個問題:

  1. Android不會為您清除屏幕。 您需要通過擦除屏幕來開始每個繪圖會話,否則您將看到以前渲染的內容。 這就是為什么屏幕上會出現一條線污跡的原因。 此外,輸出表面可能是雙緩沖或三緩沖的,因此在某些情況下,如果不進行擦除,則在動畫時它實際上會“閃爍”。

  2. 您沒有在Surface上繪圖。 SurfaceView有兩個部分,Surface和View。 通過覆蓋onDraw()您就像在自定義視圖上一樣在View上繪圖,除了使用SurfaceView浪費了系統資源。 如果要在Surface上繪制,則需要從SurfaceHolder獲取畫布。 (如果在View上進行繪制,請繼續進行此操作,以便您可以利用硬件加速。)

另請參閱圖形體系結構文檔的“ 表面生命周期”部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM