執筆中
目次
「android:baselineAligned」がなぜ lint の警告対象なのか。
解説されているブログ
元々、ADT-16にしたときから警告が出ていたので気になっていた。
探してみたら既に記事があったので、まずは掲載。
- Androidアプリ開発
- http://android49.blog.fc2.com/
- Androidアプリ開発 「android:baselineAligned」とは
なぜ警告対象になるんだろう。
「なるほどなぁ~」と解説を読んだのだが、ふと、どのくらいの警告レベルなんだろうと思った。
<merge>タグは明らかにViewGroupが減っているので顕著なんだが、
設定を1つ false にする程度で、どうして警告が出るんだろうか。
そこんとこがちょっと引っかかったので調べてみる。
LinearLayoutのソースから baselineAligned の動きを読み解く。
まずは android.widget.LinearLayout を眺めてみることにする。
記憶されるフィールド名は mBaselineAligned で、
代入以外の使用箇所は以下の2メソッド
- android.widget.LinearLayout.measureHorizontal(int, int)
- android.widget.LinearLayout.layoutHorizontal()
それぞれが何をしているのか。
LinearLayout.measureHorizontal(int, int)
この処理が長そうだ。
- child.measure(freeSpec, freeSpec);
この中で呼んでいる
- onMeasure(widthMeasureSpec, heightMeasureSpec);
は、android.widgetにあるほぼ全てのViewを継承したクラスがOverrideしている。
例としてImageViewでは、646~749行目までの約100行が使われている。
Drawableの有無や幅・高さはもちろん、
パディングやアスペクトも考慮された計算がずらずらと・・・。
特にViewGroupの処理は顕著で、
子Viewを全て計算すると子Viewから想定される“ちょうどいい”感じを
頑張って導き出している。
呼び出される回数によっては危なそうだ。
LinearLayout.layoutHorizontal()
こちらは以下のメソッドがルートになっている。
- android.widget.LinearLayout.onLayout(boolean, int, int, int, int)
measureHorizontal()と同じように色々と計算があるものの、
子Viewに対する重めの呼び出しがないようなので、
すごく遅くなるイメージではない。
MyLinearLayoutを作って確認してみることにする。
public class MyLinearLayout extends LinearLayout {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
long start
= System.
currentTimeMillis(); super.onMeasure(widthMeasureSpec, heightMeasureSpec);
L.
d("process time = %d",
System.
currentTimeMillis() - start
); }
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
long start
= System.
currentTimeMillis(); super.onLayout(changed, l, t, r, b);
L.
d("process time = %d",
System.
currentTimeMillis() - start
); }
}
画面はこんなの。
ListFragmentが2つでタブに登録されていて、ボタンがいくつか。
メニューも2項目ある。
ルートのViewGroupとして指定して回数/時間を確認してみると、
まとめ
最終更新:2012年02月15日 03:39