layout_weight
속성을 사용하여 여러보기 사이의 비율을 만드는 몇 가지 레이아웃 파일 을 작성했습니다.
언젠가 중첩 가중치에 대한 보푸라기 경고가 표시되기 시작합니다.
따라서 중첩 가중치가 성능에 나쁜 이유와 다른 화면 크기에 사용할 수 있고 많은 치수 dpi 값을 지정할 필요가없는 뷰 크기간에 일정한 비율을 만드는보다 효율적인 방법이 있는지 궁금합니다. 여러 레이아웃 파일을 통해 (다른 화면 크기의 경우).
감사합니다!
layout_weight
속성을 사용하여 여러보기 사이의 비율을 만드는 몇 가지 레이아웃 파일 을 작성했습니다.
언젠가 중첩 가중치에 대한 보푸라기 경고가 표시되기 시작합니다.
따라서 중첩 가중치가 성능에 나쁜 이유와 다른 화면 크기에 사용할 수 있고 많은 치수 dpi 값을 지정할 필요가없는 뷰 크기간에 일정한 비율을 만드는보다 효율적인 방법이 있는지 궁금합니다. 여러 레이아웃 파일을 통해 (다른 화면 크기의 경우).
감사합니다!
답변:
중첩 가중치는 다음과 같은 이유로 성능이 좋지 않습니다.
레이아웃 가중치는 위젯을 두 번 측정해야합니다. 가중치가 0이 아닌 LinearLayout이 0이 아닌 가중치가있는 다른 LinearLayout 내에 중첩되면 측정 수가 기하 급수적으로 증가합니다.
RelativeLayout 을 사용하고 특정 dpi 값을 사용하지 않고 다른 뷰의 위치에 따라 뷰를 조정 하는 것이 좋습니다 .
업데이트 : 우리가 알고있는 것처럼 퍼센트 지원 라이브러리는 API 레벨 26에서 더 이상 사용되지 않습니다. ConstraintLayout
동일한 플랫 XML 구조를 얻는 새로운 방법입니다.
업데이트 된 샘플 :
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fifty_thirty"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#ffff8800"
android:gravity="center"
android:text="@string/fifty_fifty_text"
android:textColor="@android:color/white"
app:layout_constraintHeight_default="percent"
app:layout_constraintHeight_percent="0.5"
android:textSize="25sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.5" />
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#ffff5566"
android:gravity="center"
android:text="@string/fifty_fifty_text"
android:textColor="@android:color/white"
android:textSize="25sp"
app:layout_constraintHeight_default="percent"
app:layout_constraintHeight_percent="0.5"
app:layout_constraintLeft_toRightOf="@id/fifty_thirty"
app:layout_constraintTop_toBottomOf="@id/fifty_thirty"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.5" />
</android.support.constraint.ConstraintLayout>
업데이트 : 좋은 소식 안드로이드 퍼센트 지원 라이브러리는 성능 문제와 중첩 된 지저분한 가중치를 해결합니다.LinearLayout
compile 'com.android.support:percent:23.0.0'
이 간단한 레이아웃을 고려하여 동일하게 설명하십시오.
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/fifty_huntv"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#ff7acfff"
android:text="20% - 50%"
android:textColor="@android:color/white"
app:layout_heightPercent="20%"
app:layout_widthPercent="50%" />
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_toRightOf="@id/fifty_huntv"
android:background="#ffff5566"
android:text="80%-50%"
app:layout_heightPercent="80%"
app:layout_widthPercent="50%"
/>
</android.support.percent.PercentRelativeLayout>
가중치 LinearLayout
와 중첩 된 성능 저하를 피했습니다 .
나는 (그리고 아마 이것에 대해 화를 낼 것이다) 생각하지만, 내 전화는 대부분의 사람들의 가정용 PC와 경쟁 할 수있는 쿼드 코어 프로세서를 가지고 있다고 생각합니다.
또한 이런 종류의 하드웨어 기능은 전화의 미래라고 생각합니다.
그래서 결론을 내 렸습니다. 네가 중첩되지 않는 한 (MHO에서 레이아웃은 4 레벨 이상이어야하며, 잘못하는 경우) 휴대 전화는 덜 신경 쓸 수 있습니다. 무게를 갖는 것에 대해.
성능에 훨씬 더 많은 영향을 미치고 프로세서가 추가 수학을하는 것에 대해 걱정할 수있는 많은 일들이 있습니다.
(저는 약간 유머러스 하므로이 게시물에서 너무 심각하게 생각하지 않아야합니다. 다른 것보다 먼저 최적화 해야하는 다른 것들이 있으며 2-3 레벨의 깊은 무게에 대해 걱정하는 것이 도움이되지 않는다는 생각 당신의 건강)
중첩 된 가중치가 나쁜 주된 이유는 레이아웃에 가중치가있는 자식이있을 때 레이아웃을 두 번 측정해야하기 때문입니다 (보풀이 경고에 언급되어 있다고 생각합니다). 즉, 가중 레이아웃도 포함하는 가중 레이아웃은 4 번 측정해야하며 추가하는 각 '레이어'레이어는 2의 거듭 제곱으로 측정 값을 증가시킵니다.
ICS (API 레벨 14) GridLayout
에 추가되어 이전에 가중치가 필요한 많은 레이아웃에 대해 단순하고 '평평한'솔루션을 허용합니다. 이전 버전의 Android를 위해 개발하는 경우 가중치를 제거하는 데 약간의 시간이 걸리지 만 RelativeLayout
해당 택시에 레이아웃을 최대한 많이 사용하면 일반적으로 중첩 된 가중치가 많이 제거됩니다.
GridLayout
또는로 동일한 결과를 얻을 수 있다고 생각하지 않습니다 RelativeLayout
. 예 GridLayout
: "GridLayout은 무게로 정의 된 무게의 원리에 대한 지원을 제공하지 않습니다. 따라서 일반적으로 여러 구성 요소간에 여분의 공간을 분배하도록 GridLayout을 구성 할 수 없습니다."
가중치가있는 중첩 된 LinearLayouts를 피하는 쉬운 솔루션이 있습니다. weightSum과 함께 Tablelayout을 사용하고 weightSum과 함께 중첩 된 LinearLayout을 사용하십시오-Tablelayout은 LinearLayout (동향, weightSum, layout_weight 등)과 동일한 속성을 가지며 메시지를 표시하지 않습니다- "중첩 된 가중치 성능이 나쁘다 "
예:
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.8"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.2"
android:orientation="horizontal"
android:weightSum="1">
<ImageView
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="0.4"/>
<TextView
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_weight="0.6"/>
</LinearLayout>
</TableLayout>