web-dev-qa-db-ja.com

baselineAlignedをfalseに設定すると、LinearLayoutのパフォーマンスがどのように向上しますか?

私はxmlでUIを作成していましたが、Lintから警告が表示され、Android:baselineAlignedをfalseに設定してListViewのパフォーマンスを改善するように言われました。

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

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

なぜこれがパフォーマンスを改善するのか、特に体重が関係する場合、誰かが説明できますか?

205

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

154
Nima G

how Android:baselineAligned="false"ヘルプ。それは答えではないかもしれませんが、コンセプトを得るのに役立ちます。

水平LinearLayoutの中心に垂直に3つのアイテム(アイコン、テキスト、ボタン)を取得できました。

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

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

19
Xar E Ahmer
// 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#L109

14
boiledwater