0

キャンバスを使用してサーフェスビューにテキストを描画しようとしています。問題は、各呼び出しの後にサーフェスビューがリセットされていないように見えることです。以前に描画されたものはすべて、再度描画されます。したがって、描画するたびに位置を変更するテキストがある場合、キャンバスがクリアされていないため、そのテキストの長いトレースになってしまいます。

私は何が間違っているのですか?

public class Test1Activity extends Activity {

private Draw drawText;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     drawText = new Draw(this);
    setContentView(drawText);
}

public class Draw extends SurfaceView implements Runnable {

    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private int i;

    public Draw(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        surfaceHolder = getHolder();
        running = true;
        thread = new Thread(this);
        thread.start();
    }


    public void run() {
        // TODO Auto-generated method stub
        while (running) {
            if (surfaceHolder.getSurface().isValid()) {
                Canvas canvas = surfaceHolder.lockCanvas();

                Paint paint = new Paint();
                paint.setColor(Color.RED);
                i++;
                if(i > 240)
                    i = 1;

                canvas.drawText("Hello",i , 60, paint);

                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

}
}      

public class Test1Activity extends Activity {


private Draw drawText;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

     drawText = new Draw(this);
    setContentView(drawText);
}



public class Draw extends SurfaceView implements Runnable {

    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private int i;

    public Draw(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        surfaceHolder = getHolder();
        running = true;
        thread = new Thread(this);
        thread.start();
    }


    public void run() {
        // TODO Auto-generated method stub
        while (running) {
            if (surfaceHolder.getSurface().isValid()) {
                Canvas canvas = surfaceHolder.lockCanvas();

                Paint paint = new Paint();
                paint.setColor(Color.RED);
                i++;
                if(i > 240)
                    i = 1;

                canvas.drawText("Hello",i , 60, paint);

                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

}

ありがとう!

4

2 に答える 2

1

たとえば、何かを描く前に、キャンバスを消去する必要があります。canvas.drawColor(Color.BLACK);

  • ereas(黒く描く)
  • テキストを描く

注意:更新およびレンダリングスレッドでペイントオブジェクトを作成しないでください。GCが狂ってしまいます。

于 2012-07-22T15:54:45.873 に答える
0

古いキャンバスを別のPorterDuffモードで再描画する必要がある場合があります。 このリンクは便利です。

于 2012-07-22T13:59:08.957 に答える