226

xml でいくつかの UI を作成したところ、Lint から警告が表示され、ListView でのパフォーマンスを向上させるために android:baselineAligned を false に設定するように言われました。

この警告を追加した Lint の変更に関するドキュメントには、

レイアウトのパフォーマンス: パフォーマンスを向上させるために android:baselineAligned="false" を設定する必要がある重みを持つ LinearLayouts を検索し、パフォーマンスの問題を引き起こす可能性のあるネストされた重みがある場合も検出します。

特に重量が関係している場合、これがパフォーマンスを向上させる理由を誰かが説明できますか?

4

3 に答える 3

171

を設定android:baselineAligned="false"することで、アプリのレイアウトが子のベースラインを揃えるために必要な余分な作業を防ぐことができます。これにより、明らかにパフォーマンスが向上します。(UIの不要な操作が減る => パフォーマンスが向上する)

于 2012-02-16T23:42:13.303 に答える
22

どのようにandroid:baselineAligned="false" 助けます。答えにはならないかもしれませんが、概念を理解するのに役立ちます。

水平方向の LinearLayout で垂直方向に中央に配置された 3 つの項目 (アイコン、テキスト、ボタン) を取得することができました。

これは単純に思えるかもしれませんが、実際には LinearLayout 属性として android:gravity="center_vertical" を指定するだけでは十分ではありません。アイコンは中央に配置されますが、テキストとボタンはそうではありません。これは、(おそらく) テキストにベースラインがあり、センタリング アルゴリズムが「実際の」垂直方向の中央ではなくベースラインを使用するためです。しかし、さらに悪いことに、(テキストの隣にある) ボタンは、テキストのベースラインを使用して中央に配置されます!

LinearLayout で android:baselineAligned="false" を指定すると、これがオフになり、すべてが正しく中央に配置されます。

于 2014-07-14T10:27:55.387 に答える
16
// Baseline alignment requires to measure widgets to obtain the
                // baseline offset (in particular for TextViews). The following
                // defeats the optimization mentioned above. Allow the child to
                // use as much space as it wants because we can shrink things
                // later (and re-measure).
                if (baselineAligned) {
                    final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                    child.measure(freeSpec, freeSpec);
                }

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/LinearLayout.java#L1093

于 2013-11-19T09:16:25.310 に答える