多層Viewの注意点 ~redrawされない現象

 TextView が描画更新されなくなったよ。
 どうやら、onDraw イベント自体が発生してないみたい。
 invalidate() でrepaint しても効かない…。
 どないせいっちゅうねん?!

 一日中、あーでもない、こーでもないとコネくりました結果──
 どうやら原因は、View の重ね合わせにあるみたいだ…。

原因はView の多層構造

 作ってるアプリは以下のような構造になってる。

	<画面奥(下層)>

	「メッセージ表示」 (TextView)
	「選択肢表示」

	<画面手前(上層)>

 「メッセージ表示」がredraw されなくなるのは、「選択肢表示」をINVISIBLE にしてから。
 つまり「選択肢表示」がredraw されなくなってからだ。
 どうやら、上の層でredraw しないと、下の層もredraw しないらしい。
 どうりで、TextView でinvalidate() かけても描画更新されないワケだよ…。orz

 これは上の層が INVISIBLE の状態であってもredraw されない。
 また、下の層が上の層の描画範囲外の場合も、redraw されない。
 理屈はわかるけど、ひどい仕様だよ。まったく…。

まとめ

  1. 上層でredraw しないと、下層もredraw しない
  2. 上層が INVISIBLE の状態であっても同様
  3. 下層が上層の描画範囲外だとredraw されない

by the way…

 wrap_parent の多層構造となっている場合。
 最上層に透明なfill_parent のView を配置し、ソレにinvalidate をかけるようにしてやるといいかもしれない。
 今回、定期的に、最上層を描画更新するようにしたら、全体的に描画の反応がよくなった。
 てか、いままで手放しでTextViewが更新されてたのって、そういうことでもあったんだね。(^_^;

Comments are closed.