BaselineAlignedの設定は、linearlayoutのパフォーマンスを誤って改善するためにどのように改善しますか?
-
26-10-2019 - |
質問
私はXMLでいくつかのUIを構築していただけで、Lintが私に警告を与え、Androidを設定するように言った:BaselineAligned falseにfalseに向かってListViewのパフォーマンスを改善しました。
この警告を追加した糸くずの変更のドキュメント
レイアウトパフォーマンス:Androidを設定する必要があるウェイトでLinearLayoutsを見つけます:BaselineAligned = "false"をより良いパフォーマンスを発見し、パフォーマンスの問題を引き起こす可能性のあるウェイトをネストしたケースを見つけます。
特に体重が関係するとき、これがパフォーマンスを改善する理由を誰かが説明できますか?
解決
設定することにより android:baselineAligned="false"
、子供のベースラインを調整するために、アプリのレイアウトがしなければならない余分な作業を妨げています。これにより、パフォーマンスが明らかに向上する可能性があります。 (UI =>パフォーマンスの向上に対する不必要な操作が少ない)
他のヒント
どうやって android:baselineAligned="false"
ヘルプ 。それは答えではなく、概念を得るのに役立ちます。
水平リニアレイアウトで垂直に中央にある3つのアイテム(アイコン、テキスト、ボタン)を手に入れることができました。
これは単純に思えるかもしれませんが、実際にはAndroid:Gravity = "Center_vertical"をLinearLayout属性として指定するだけでは不十分です - アイコンは中心ですが、テキストとボタンはそうではありません。これは、(おそらく)テキストにベースラインがあり、センタリングアルゴリズムが「実際の」垂直中心ではなく使用するためです。しかし、さらに悪いことに - ボタン(テキストの横にあります)は、テキストのベースラインを使用して中心にあります!
Androidの指定:LinearLayoutのBaselineAligned = "False"をオフにし、すべてが正しく中心になります。
// 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);
}