LinearLayoutでandroid:baselineAlignedが警告されるソース的根拠

執筆中

目次


「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を作って確認してみることにする。

  1. public class MyLinearLayout extends LinearLayout {
  2.  
  3. public MyLinearLayout(Context context, AttributeSet attrs) {
  4. super(context, attrs);
  5. }
  6.  
  7. @Override
  8. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  9. long start = System.currentTimeMillis();
  10. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  11. L.d("process time = %d", System.currentTimeMillis() - start);
  12. }
  13.  
  14. @Override
  15. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  16. long start = System.currentTimeMillis();
  17. super.onLayout(changed, l, t, r, b);
  18. L.d("process time = %d", System.currentTimeMillis() - start);
  19. }
  20. }

画面はこんなの。
ListFragmentが2つでタブに登録されていて、ボタンがいくつか。
メニューも2項目ある。

ルートのViewGroupとして指定して回数/時間を確認してみると、


まとめ





最終更新:2012年02月15日 03:39
添付ファイル