1

Android SDKで2Dグラフィックスをいじくり回していて、簡単な例に問題があります。

私は基本的/基本的な何かを誤解しているだけだと思います。

public class DrawView extends View {
    Paint paint = new Paint();
    Canvas canvas = new Canvas();

    public DrawView(Context context) {
        super(context);
        paint.setColor(Color.BLACK);
    }

    @Override
    public void onDraw(Canvas canvas) {
        this.canvas = canvas;
        this.canvas.drawLine(0,0, 500, 500, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("DrawView", "onTouchEvent: " + event.getX() + "," + event.getY() );

        canvas.drawLine(0,500, 500, 0, paint);

        return true;
    }
}

上記のコードは、アプリの起動時から開始時まで0,0に1本の線を描画します。500,500その部分はうまく機能します。

問題は、タッチイベントで2番目の線が描画されないことです。ログに座標デバッグメッセージが表示されるため、これonTouchEventは間違いなく呼び出されています。

誰かが私が間違っていることを指摘できますか?

4

3 に答える 3

8

onTouchEvent()の最後にinvalidate()を呼び出して、システムに画面を更新するように指示することになっています。invalidate()を呼び出すと、onDraw()が呼び出されます。

また、根本的に間違っているのは、所有しているこのクラスでキャンバスを作成することです。それはあなたにとって全く何もしません。描画するキャンバスは、onDraw()メソッドから取得したものです。onToucheventでのcanvas.drawLine()の呼び出しは何もしていないので、そこにあるべきではありません。これは空のキャンバスであり、「投稿」されるものではありません。

onTouchEvent()では、タッチイベントデータのみを収集し、必要に応じてそのデータに対して何らかの処理を行う必要があります。そこで描画メソッドを呼び出さないでください。ただし、前述したように、onTouchEvent()から描画をトリガーする場合は、invalidate()を呼び出します。触れている場所に基づいて線を描画する場合は、X座標とY座標であるクラス変数を作成する必要があります。これらのX変数とY変数をonTouchEvent()で更新してから、それらをonDraw()で使用して、これらのX変数とy変数に基づいて必要なものを描画します。

于 2012-08-21T20:28:32.040 に答える
0

postInvalidate()関数を呼び出します。この関数は、ビューを再描画する必要があることを通知します(イベントループ呼び出しonDraw()関数)。

于 2012-08-21T20:55:24.337 に答える
0

クラスでbool変数を宣言して、ユーザーが触れたメソッドに渡すことができます。ondraw()また、他のfloat変数とともにXとYをondraw()methodeに渡すこともできます。onTouchEvet()ただし、システムが新しいタッチオーダーを使用してキャンバスを再描画するように、無効にする必要があります。

于 2013-06-24T23:56:18.110 に答える