グラフィックスに慣れるために、Android SDK のサンプル Finger Paint アプリの作成を開始しました。最近、元に戻す/やり直しを実装しようとしていますが、試したすべての方法で障害に遭遇しました。これに関するいくつかのスレッドを見つけましたが、これらの問題を乗り越えたスレッドはありません。ここに私の主な2つの試験があります:
戦略 1:
パス (またはキャンバス) のスタックを保存し、元に戻すときに画面をクリアして、最後のパスを除く各パスを再描画します (または最新のキャンバスを元に戻します)。
ここでの問題はおそらく単純ですが、ビューに何も再描画させることができません。保存したパスを描画する (または保存したキャンバスを復元する) にはどうすればよいですか?
戦略 2:
タッチするたびに getDrawingCache() を使用してビットマップのスタックを保存します。元に戻すときは、最後のビットマップを元に戻します。
保存は runnable から post() を介して実行する必要があるため、onDraw() が終了した後に実行されます (post は、invalidate() の後にシステム メッセージ ラインに追加します)。問題は、実行可能な getDrawingCache() から実行すると、最初のバージョン以降の変更が表示されないように、常に最初のバージョンのペイントが返されることです。
getDrawingCache() が runnable から呼び出されたときに、ビューの現在の状態が表示されないのはなぜですか?
私はこれでしばらく戦ってきました。ありがとう。
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
Runnable r = new Runnable(){
@Override
public void run() {
myView.storeView();
}
};
myView.post(r);
}
public void storeView(){
historyCount++;
if(historyCount > historySize) historyCount = 6; //We don't want more than 6
history.add(Bitmap.createBitmap(myView.getDrawingCache()),historyCount);
}