baselineAligned를 false로 설정하면 LinearLayout의 성능이 어떻게 향상됩니까?


218

방금 XML로 UI를 작성하고 있었고 Lint는 경고를 표시하고 ListView의 성능을 향상시키기 위해 android : baselineAligned를 false로 설정했다고 말했습니다.

이 경고를 추가 한 Lint 변경에 대한 문서는

레이아웃 성능 : 성능 향상을 위해 android : baselineAligned = "false"를 설정해야하는 가중치가있는 LinearLayouts를 찾고 중첩 된 가중치가있어 성능 문제를 일으킬 수있는 경우도 찾습니다.

누군가 체중이 관련 될 때 왜 이것이 성능을 향상시키는 지 설명 할 수 있습니까?

답변:


165

을 설정 android:baselineAligned="false"하면 앱의 기준선을 맞추기 위해 앱의 레이아웃이 수행해야하는 추가 작업을 방지 할 수 있습니다. 분명히 성능을 향상시킬 수 있습니다. (UI에서 불필요한 조작이 적을수록 성능이 향상됨)


20
그 부분은 분명하다. 내가 얻으려고했던 것은 체중이 포함될 때 이것이 왜 성능 향상입니까?
크리스토퍼 페리

185
기준은 무엇입니까?
Matt

48
기준선이라는 용어는 타이포그래피에서 나옵니다. 텍스트의 보이지 않는 줄 문자입니다. en.wikipedia.org/wiki/Baseline_%28typography%29
Zsolt Safrany

12
따라서 성능이 향상되면 일반적으로 수행되는 작업이 더 이상 수행되지 않습니다. 이것의 부작용은 무엇입니까? 우리가 지금 피하고있는 일에 다른 결과를 낼 수있는 능력이 있습니까?
lhunath

30
설명서에 따라 @lhunath는 기본값이 true 로 설정되어 있습니다 . 그러면 UI 텍스트의 기준선이 서로 정렬됩니다. 예를 들어 버튼에 대해 생각하면 같은 줄에 너비 / 높이가 동일한 두 개의 버튼이 있지만 그중 하나는 더 긴 텍스트를 가지고 있기 때문에 더 긴 텍스트가 baselineAlined="true"있는 버튼은 텍스트를 다른 버튼과 정렬하기 위해 움직일 수 있습니다. 더 좋은 예를 보려면 이 게시물을
Nima G

20

어떻게 android:baselineAligned="false" 도와주세요. 대답은 아니지만 개념을 얻는 데 도움이 될 수 있습니다.

방금 가로 LinearLayout에서 세로로 가운데에 3 개의 항목 (아이콘, 텍스트, 버튼)을 가져 왔습니다.

이것은 단순 해 보이지만 실제로 LinearLayout 속성으로 충분하지 않은 경우 android : gravity = "center_vertical"을 지정하면 충분합니다. 아이콘이 가운데에 있지만 텍스트와 버튼이 아닙니다. 텍스트에 기준선이 있고 중심 알고리즘이 '실제'수직 중심 대신 텍스트를 사용하기 때문입니다. 그러나 더 나쁜 것은 텍스트 옆에있는 버튼이 텍스트의 기준선을 중심으로한다는 것입니다!

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.