0

画面に触れたところに円を描こうとしているだけです。画面に触れるとそこに円が描かれますが、画面の別の場所に触れると新しい円が描かれます(新しい円ではなく、古い円がそこに表示されるはずです)。なぜこれが起こっているのか誰にもわかりますか?コード:

スレッドクラス:

public class GameThread extends Thread{
    private SurfaceHolder sHolder;
    private DrawingSurface dSurface;

    private boolean okToRun;

    Paint redPaint = new Paint();

    public int x, y;

    boolean myTouchEvent(MotionEvent event){
        int touch = event.getAction();
        switch(touch){
            case MotionEvent.ACTION_DOWN:
            x = (int) event.getX();
            y = (int) event.getY();
        }
        return true;
    }

    public GameThread(SurfaceHolder holder, DrawingSurface surface){
        sHolder = holder;
        dSurface = surface;
        redPaint.setARGB(255, 255, 0, 0);
    }//GameThread()

    public void setOkToRun(boolean status){
        okToRun = status;
    }//setOkToRun()

    public void run(){
        while(okToRun){//gameloop
            Canvas canvas = null;
            try{
                canvas = sHolder.lockCanvas(null);
                synchronized(sHolder){
                    try{
                        canvas.drawCircle(x, y, 60, redPaint);
                    } catch (Exception e){
                    }
                }
                } finally {
                if (canvas != null) {
                    sHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }//run()
}

私の surfaceview クラスの関連するメソッドは次のとおりです。

@Override
public boolean onTouchEvent(MotionEvent event) {
    return drawingThread.onTouchEvent(event);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
        drawingThread = new GameThread(getHolder(), this);
        drawingThread.start();
        drawingThread.setOkToRun(true);
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
    radius += 10;
    drawingThread.setOkToRun(false);
    try {
        drawingThread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

明確にするために:私は単一の円を描き、画面をタップするたびに表示したいと考えています。それはしません。このコードでなぜそうなのか分かりますか?

4

1 に答える 1

2

画面に触れた場所に円を描く必要があることは正しいと思いますが、問題は、以前のタッチからの円がまだ画面に表示されることです。この場合の問題は、キャンバスをクリアせずに円を描いていることです。Canvas はメモリ内で配列として表されます。Canvas.drawCircle() を呼び出すと、メモリの一部が円のイメージによって書き換えられます。繰り返し行うと、キャンバスには画面上に描かれている円がさらに含まれます。新しい円を描く前に、キャンバス全体を再描画する必要があります。これは、Canvas.drawCircle() メソッドを呼び出す前に、 Canvas.drawColor()メソッドを呼び出すことで実行できます。選択した色でキャンバス全体をクリアします。

于 2013-08-11T20:56:07.270 に答える