0

ペイントアプリでビューを再描画するのに問題があります。タッチが終了したら、touch_up()を呼び出してパスを作成し、invalidate()を呼び出してパスを描画し、storeView()を呼び出して現在のビューをスタックにプッシュします。ただし、ビューはまったく再描画されません(次のタッチまで、ひねくれた効果が得られます)。storeView()の呼び出しを削除すると、すぐに再描画されます。

ここから、問題がinvalidate()であることがすぐに発生するとは限らないことを理解し、それを待つために新しいスレッドまたはハンドラーを作成する必要があると思います。開発ページを読んだにもかかわらず、私はそれを実装する方法を完全には理解していません。

それは本当に私がする必要があることですか?ビューが再描画されるまでstoreView()を待機させるにはどうすればよいですか?私はこれとしばらく戦ってきました、答えは私の日を作るでしょう。ありがとう!

これが私が現在していることです。

Action_up:

case MotionEvent.ACTION_UP:
    touch_up();
    invalidate();
    storeView();
    break;

Touch_up:

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

storeView:

public void storeView(){
    historyCount++;
    if(historyCount > historySize) historyCount = 6;    //We don't want more than 6
    history.add(Bitmap.createBitmap(myView.getDrawingCache()),historyCount);
}
4

1 に答える 1

1

タッチが終了したら、touch_up() を呼び出してパスを作成し、invalidate() を呼び出して描画し、storeView() を呼び出して現在のビューをスタックにプッシュします。

storeView()がビットマップ全体を保持しているのはなぜですか? 再生できる (場合によっては元に戻すこともできる) 保存コマンドを使用しないのはなぜですか? このようにRAMのゴブとゴブを取っています。

ここから、invalidate() が必ずしもすぐに発生するとは限らない問題であることを理解しています

正しい。

それを待つために新しいスレッドまたはハンドラーを作成する必要があると思います。

いいえ、ビットマップ全体を保存する実装に固執する場合は、完了storeView()後に呼び出されることを確認する必要がありますinvalidate()storeView()への呼び出しをaにラップし、onへの呼び出しを介してRunnableスケジューリングするだけで十分です。Runnablepost()myView

于 2011-07-22T17:59:52.900 に答える