2011-07-25 15 views
2

imageViewを拡張する独自のキャンバスクラスを作成しました。私のonDraw()メソッドはユーザーのgpsの位置を描画し、ユーザーが移動するたびにこのonDrawメソッドを呼び出し続けます。私の問題は、一度だけ描画する必要があるgpsの軌跡を描きたいということです(ユーザーが動いたときに更新する必要はありません)。私は1つ以上のonDrawメソッドを持つことが可能か、または1)ユーザーの場所と2)gpsのトレイルを分離する方法があるのだろうかと疑問に思っていますか?アンドロイドキャンバス - 私は複数の描画方法がありますか?

私の理由は、ユーザーがGPSの位置を変更するたびにgpsルートを再描画してメモリを浪費したくないからです。それは無駄です。

答えて

1

あなたはパフォーマンスにヒットを見ましたか?そうでない場合は、心配しないでください。私はこれがCPUサイクルを無駄にしていると思います。アプリがすでに十分に速いと思われる場合は、最適化について心配する必要はありません。

あなたのアプリが少し遅くて、トレイルがボトルネックであることがわかったら...ビットマップにキャッシュすることをお勧めします。この方法では、まだトレイルを描く必要がありますが、各フレームのトレイルの座標を計算する必要はありません。

0

私はあなたの質問を正しく理解したと仮定して、1つのonDrawメソッドを超えることはできません。これをどう対処するかについての別のアプローチについて考える必要があります。

@DeeVが提案した、それはあなたのための解決策になります。

1

最近私は幾分似たような問題を解決しなければなりませんでした。

多くの場合、頻繁に再描画したくない背景グラフィックを含む重複した複数のビューと、頻繁に更新されるグラフィックを含む前景ビューを使用できます。次に、パフォーマンスを得るために、バックグラウンドViewのonDraw()をデザインして、それをクラス変数として保持しているビットマップに裏打ちすることができます。最初のonDraw()の背景グラフィックでは、比較的遅いキャンバスへの描画を行います。その後のonDraw()の呼び出しでは、Bitmapをキャンバスに描画するだけです。

私はこれを自分でやったことがあります。基本的に私のアプリケーションは、いくつかのグラフィカルなゲージを表示しています。これらのゲージには、モデルデータの変更に伴って何度も再描画する必要があるポインターグラフィックとゲージ面、ゲージ面の凡例が1回だけ描​​画されます。まず、バックグラウンド・グラフィックスと前景グラフィックスを別々の重なり合うビューに分割します。現在、フォアグラウンドポインタグラフィックを無効化して再描画すると、オーバーラップするものも無効化されるため、バックグラウンドグラフィックスビューのメソッドは、ポインタViewが再描画されるたびに呼び出されます。バックグラウンドビューは、背景グラフィックスを一度描画するだけで、キャンバスをバックアップするBitmapを保持します。その後、このビットマップをCanvasに描画します(Path()オブジェクトを使用してグラフィックを最初に作成するよりもはるかに高速です) 。

​​3210
関連する問題