2012-01-01 4 views
1

私はいくつかのImageViews(透明領域を持つ)が互いの上にある相対レイアウトを持っています。問題は、それらのいずれかを無効にすると、他のすべてのonDraw()メソッドも呼び出されることです。これは正常ですか? これは大きなパフォーマンスの問題であるため、すべてのレイヤー(ビュー)を再描画する必要はありません。無効化されたビューを再描画するだけです。Android:影響を受けていないレイヤの無効化/再描画を回避するにはどうすればよいですか?

アイデアはありますか?

答えて

1

これは正常ですか?

はい。

これは大きなパフォーマンスの問題があるため

パフォーマンスのボトルネックがどこにあるかを識別するためにTraceviewを使用してください。

または、実際にはlayersを使用してください。

ゲームを作成する場合は、ウィジェットフレームワークを使用せず、代わりに直接Canvas(またはOpenGLを使用)に描画してください。

+0

申し訳ありませんが、確かめてください。 1つのレイアウト/ビューでアニメーションボタンを持っていて、グラフィックレイアウト/ビュー(onDraw()で描画)をオーバーラップし、ボタンを押すと(アニメーション化...)、基礎となるグラフィック全体を再度描画する必要がありますか?私には奇妙に聞こえる - なぜ、それぞれのビューに無効化メソッドがあるのですか? ... – stoefln

+0

@stoefln: "基礎となるグラフィック全体を再度描画する必要がありますか?" - 再描画の範囲は、Androidが再描画する必要があると思われるものになります。Androidでは、自分では考えられないように再描画する必要があると思う傾向があります。 – CommonsWare

+0

"Traceviewを使用して、パフォーマンスのボトルネックが存在する場所を特定します。 →ボトルネックはパスの描画です。私はこれをより速くすることはできません。私が必要とするのは、ビューをキャッシュする可能性だけです。なぜなら、一度描画する必要があるからです。 "または、おそらく実際にレイヤーを使用します。" →これはandroid 2.1でサポートされていません。 "...代わりにキャンバスに直接描画する" - >それが私の行いです。私はビューのonDraw()でキャンバスに描画しますが、私が言ったように、これはいくつかの処理を必要とします。別のビューの一部のコンポーネントを再描画するたびに余裕がありません。 – stoefln

2

Viewinvalidate()を使用しているとしたら、otherのいずれかを試してみてください。理論的には、影響を受けた(汚れた)領域のみを再描画します。

void invalidate(Rect dirty) 
void invalidate(int l, int t, int r, int b) 
void invalidateDrawable(Drawable drawable) 

thisも参照してください(約34:07マーク)。彼らはこれを詳細に説明する素敵なデモを持っています。

+0

良いビデオ - ありがとう! – stoefln

関連する問題