1

私は Android OS に戻ってきており、キャンバスとペイントを調査することにしました。

ここで、単純なペイント アプリケーションを作成するコードをいくつか見つけました。しかし、私は1つのことについて少し混乱しています。ペイント クラスでは、これを行います。

public boolean onTouch(View view, MotionEvent event) {

    // Point holds two integer coordinates
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();

    // Add the coordinates to the array list
    points.add(point);

    invalidate();

    Log.d(TAG, "point: " + point);
    return true;
}

ホバーメッセージによるとinvalidate()

これは、UI スレッドから呼び出す必要があります。非 UI スレッドから呼び出すには、postInvalidate() を呼び出します。ビュー全体を無効にします。ビューが表示されている場合、将来のある時点で onDraw(android.graphics.Canvas) が呼び出されます。これは、UI スレッドから呼び出す必要があります。非 UI スレッドから呼び出すには、postInvalidate() を呼び出します。

postInvalidate()では、Paint クラスは UI ではないため、代わりにこれを呼び出すべきではありinvalidate()ませんか? 主なアクティビティは UI です。これについて意見を聞きたかっただけです。

PS私は両方を試してみましたが、postInvalidate()うまくいきます。

4

1 に答える 1

1

タッチ イベントへのコールバックは UI スレッド上にあります。あなたの理解は正しいですが、使用されているスレッドについては間違っています。これがバックグラウンド スレッド上にある場合は、postInvalidate() を使用します。

覚えておくべきことの 1 つは、Activity クラスにあるコードが必ずしも UI スレッドで実行されるとは限らないということです。ドキュメンテーションで UI での実行について言及されている場合、それはコードを UI スレッドで実行する必要があることを意味します。いくつかの異なるメソッドを使用して、任意のクラスの任意のコードを UI スレッドで実行できます。これを念頭に置いて、UI スレッドとバックグラウンド スレッドで同じコードを実行することが可能です。アクティビティ内に存在する以下の例を確認してください。

UI スレッド:

    runOnUiThread(new Runnable() {
            myFunction();
    });

背景スレッド:

    new Thread(new Runnable() {
            myFunction();
    }).start();
于 2013-06-04T14:34:25.577 に答える