多層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が更新されてたのって、そういうことでもあったんだね。(^_^;

Posted in View, レイアウト. Tags: , , , . 多層Viewの注意点 ~redrawされない現象 はコメントを受け付けていません »

setPadding の引数

View のsetPadding はけっこう便利だね。
 表示位置を自由に設定できるし、ボタンの大きさも切り揃えられる。
 でも、設定する値がイマイチややっこしい。

	setPadding(int left, int top, int right, int bottom)

 引数はそれぞれ、Viewの端からの値になる。
 left なら、Viewの左端から、XX dotという具合。

 下図の黒四角がViewだとして、青にPadding設定したいとする。
 その場合、それぞれピンク線の長さが、setPadding の引数となる。

 引数がマイナス値だと、緑のようにViewの表示外からの設定となる。

 ここらへん、イマイチ感覚的にしっくりこないんだなぁ。
 原点x, 原点y, 横幅w, 縦幅h って設定なら、計算なんかもラクなんだけど。
 まぁ、利点も多いんだけどね。(^_^;

Posted in Padding, View. Tags: , . setPadding の引数 はコメントを受け付けていません »