2

グラフィックスに慣れるために、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);
}
4

1 に答える 1

4

戦略 1 では、図面の一部をレンダリングするために必要なすべての情報を表すデータ構造を定義する必要があります。したがって、たとえば、ユーザーのタッチ位置を追跡して描画のセグメントを描画する場合、現在の色、描画形状、および 1 つのユーザー ジェスチャによって生成された座標の ArrayList で構成されるデータ構造を定義します。ユーザーのタッチを追跡して画面に描画すると、タッチ座標も現在のジェスチャの ArrayList に追加されます。タッチが終了したら、データ構造を元に戻すスタックにプッシュし、次のユーザー ジェスチャを待って次の構造インスタンスを作成し、データの取り込みを開始します。

さまざまなジェスチャ (塗りつぶし、フリーハンド トレース、直線など) がある場合は、それぞれに個別の構造を持つことができます。それらはすべて抽象クラスから継承できるため、すべてスタックに入れることができます。

2 番目の戦略は、恐ろしい記憶の浪費だと思います。意図したとおりに機能しない理由を理解するには、コードを確認する必要があると思います。

于 2011-07-24T01:55:12.137 に答える