私は、Android SDKのサンプルのフィンガーペイントアプリケーションの作業に取り掛かり、グラフィックについて詳しく知りました。最近、元に戻す/やり直しを実装しようとしていましたが、私が試したあらゆる方法でロードブロックを実行しました。私はこれについていくつかのスレッドを見つけたが、誰もこれらの問題を過ぎて私を得ていない。ここに私のメインの2つの試験は、次のとおりです。アンドロイドは描画アプリでアンドゥスタックを実装しています
戦略1:
保存パス(またはキャンバス)のスタックと元に戻すには、画面をクリアし、最後の1以外の各パスを再描画(または最新のキャンバスを回復します) 。
ここでの問題は単純ですが、私は何かを再描画するためのビューを取得できません。保存されたパスを描画する(または保存したキャンバスを復元する)にはどうすればいいですか?
戦略2:
保存各タッチした後getDrawingCacheを()を使用して、ビットマップのスタック。元に戻すときは、最後のビットマップを元に戻します。
保存は、onDraw()の終了後に実行されるように(つまり、invalidate()の後にシステムメッセージ行にpostを追加するように)runnableからpost()を介して実行する必要があります。問題は、実行可能ファイルgetDrawingCache()から実行されたときに、常に最初のバージョンのペインティングが返されるということです。
getDrawingCache()が実行時に呼び出されたときに、ビューの現在の状態が表示されないのはなぜですか?
私はこれとしばらく戦ってきました。ありがとう。
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);
}
第2の戦略は確かに、メモリの面では私が言うと悪い悪いアプローチです。一方、これは高速かもしれませんが、すぐにOutOfMemoryを打つことになります。 –
2番目の戦略のメインコードを追加しましたが、それほど多くはありません。私はメモリの問題を認識し、スタックの深さをかなり保守的に制限します。データ構造については、パスはすべての座標と必要な情報(塗料を除く)を保持していませんか?私はパスの歴史を持っている、私が持っている問題はそれらを再描画している。 – jarvisteve
(setDrawingCacheEnabled(true)を呼び出すことによって)myViewのキャッシュを有効にしましたか? –