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


218

私はxmlでいくつかのUIを構築しているだけで、Lintは警告を表示し、ListViewでのパフォーマンスを向上させるためにandroid:baselineAlignedをfalseに設定すると言っていました。

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

レイアウトのパフォーマンス:android:baselineAligned = "false"を設定してパフォーマンスを向上させる必要があるウェイトを持つLinearLayoutsを見つけます。また、パフォーマンスの問題を引き起こす可能性のあるネストされたウェイトがあるケースも見つけます。

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

回答:


165

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


20
その部分は明白です。私が得ようとしていたのは、体重が関係しているときのパフォーマンスの改善だけなのはなぜですか?
クリストファーペリー

185
ベースラインとは何ですか?
マット

48
ベースラインという用語は、タイポグラフィに由来します。それはテキストの上にある見えない線の文字です。en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany 2012

12
つまり、パフォーマンスの改善であれば、それは通常行われている作業がもはや行われていないことを意味します。これの副作用は何ですか?現在避けている作業には、さまざまな結果を生み出す能力がありますか?
lhunath 2013年

30
ドキュメントによると、@ lhunath、デフォルトはtrueに設定されています。これにより、UIテキストのベースラインが互いに整列します。たとえば、ボタンについて考えてみましょう。同じ行に同じ幅/高さの2つのボタンがあるようですが、そのうちの1つは長いテキストを持っていbaselineAlined="true"ます。良く例えば、チェックアウトこの記事を
ニマG

20

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

水平方向のLinearLayoutの垂直方向の中央に3つのアイテム(アイコン、テキスト、ボタン)を配置できました。

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

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


15
// 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.