2011-07-24 6 views
2

私は、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); 
} 

答えて

4

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

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

第2の戦略は、私を恐ろしい記憶豚と見なします。私はあなたのコードが意図したとおりに動作していない理由を理解する必要があると思います。

+0

第2の戦略は確かに、メモリの面では私が言うと悪い悪いアプローチです。一方、これは高速かもしれませんが、すぐにOutOfMemoryを打つことになります。 –

+0

2番目の戦略のメインコードを追加しましたが、それほど多くはありません。私はメモリの問題を認識し、スタックの深さをかなり保守的に制限します。データ構造については、パスはすべての座標と必要な情報(塗料を除く)を保持していませんか?私はパスの歴史を持っている、私が持っている問題はそれらを再描画している。 – jarvisteve

+0

(setDrawingCacheEnabled(true)を呼び出すことによって)myViewのキャッシュを有効にしましたか? –

関連する問題