태그 보관물: android-layout

android-layout

ConstraintLayout과 RelativeLayout의 차이점 사이의 차이에

나는 사이의 차이에 대해 혼란 스러워요 ConstraintLayoutRelativeLayout. 누군가가 그들 사이의 정확한 차이점을 말해 줄 수 있습니까?



답변

ConstraintLayout중첩을 피하기 위해 각보기에 몇 가지 규칙을 적용하여 레이아웃의보기 계층 구조를 최적화하고 평탄화하는 것이 목적입니다 .

규칙 RelativeLayout은 예를 들어 다른보기의 왼쪽에서 왼쪽으로 설정하는 것을 상기시킵니다 .

app:layout_constraintBottom_toBottomOf="@+id/view1"

와 달리 RelativeLayout, 핸들 (원으로 표시)을 기준으로 가로 및 세로 오프셋을 0 % 및 100 %로 표시하는 데 사용되는 값을 ConstraintLayout제공 bias합니다. 이 백분율 (및 분수)은 다양한 화면 밀도와 크기에서보기를 매끄럽게 배치합니다.

app:layout_constraintHorizontal_bias="0.33" <!-- from 0.0 to 1.0 -->
app:layout_constraintVertical_bias="0.53" <!-- from 0.0 to 1.0 -->

기준선 핸들 (원형 핸들 아래에 둥근 모서리가있는 긴 파이프)은 뷰의 내용을 다른 뷰 참조에 정렬하는 데 사용됩니다.

뷰의 각 모서리에있는 사각형 핸들 은 뷰의 크기를 dps로 조정하는 데 사용됩니다.

이것은 전적으로 의견에 근거한 것이며 ConstraintLayout


답변

상대 레이아웃 및 구속 조건 레이아웃 동등한 특성

(1) 상대적 레이아웃 :

android:layout_centerInParent="true"    

(1) 구속 조건 레이아웃 :

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"

(2) 상대적 레이아웃 :

android:layout_centerHorizontal="true"

(2) 구속 조건 레이아웃 :

app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintEnd_toEndOf="parent"

(3) 상대적 레이아웃 :

android:layout_centerVertical="true"    

(3) 구속 조건 레이아웃 :

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"

(4) 상대적 레이아웃 :

android:layout_alignParentLeft="true"   

(4) 구속 조건 레이아웃 :

app:layout_constraintLeft_toLeftOf="parent"

(5) 상대적 레이아웃 :

android:layout_alignParentStart="true"

(5) 구속 조건 레이아웃 :

app:layout_constraintStart_toStartOf="parent"

(6) 상대적 레이아웃 :

android:layout_alignParentRight="true"

(6) 구속 조건 레이아웃 :

app:layout_constraintRight_toRightOf="parent"

(7) 상대적 레이아웃 :

android:layout_alignParentEnd="true"    

(7) 구속 조건 레이아웃 :

app:layout_constraintEnd_toEndOf="parent"

(8) 상대적 레이아웃 :

android:layout_alignParentTop="true"

(8) 구속 조건 레이아웃 :

app:layout_constraintTop_toTopOf="parent"

(9) 상대적 레이아웃 :

android:layout_alignParentBottom="true" 

(9) 구속 조건 레이아웃 :

app:layout_constraintBottom_toBottomOf="parent"

(10) 상대 레이아웃 :

android:layout_alignStart="@id/view"

(10) 구속 조건 레이아웃 :

app:layout_constraintStart_toStartOf="@id/view"

(11) 상대적 레이아웃 :

android:layout_alignLeft="@id/view" 

(11) 구속 조건 레이아웃 :

app:layout_constraintLeft_toLeftOf="@id/view"

(12) 상대적 레이아웃 :

android:layout_alignEnd="@id/view"  

(12) 구속 조건 레이아웃 :

app:layout_constraintEnd_toEndOf="@id/view"

(13) 상대적 레이아웃 :

android:layout_alignRight="@id/view"

(13) 구속 조건 레이아웃 :

app:layout_constraintRight_toRightOf="@id/view"

(14) 상대적 레이아웃 :

android:layout_alignTop="@id/view"  

(14) 구속 조건 레이아웃 :

app:layout_constraintTop_toTopOf="@id/view"

(15) 상대적 레이아웃 :

android:layout_alignBaseline="@id/view" 

(15) 구속 조건 레이아웃 :

app:layout_constraintBaseline_toBaselineOf="@id/view"

(16) 상대적 레이아웃 :

android:layout_alignBottom="@id/view"

(16) 구속 조건 레이아웃 :

app:layout_constraintBottom_toBottomOf="@id/view"

(17) 상대적 레이아웃 :

android:layout_toStartOf="@id/view"

(17) 구속 조건 레이아웃 :

app:layout_constraintEnd_toStartOf="@id/view"

(18) 상대적 레이아웃 :

android:layout_toLeftOf="@id/view"  

(18) 구속 조건 레이아웃 :

app:layout_constraintRight_toLeftOf="@id/view"

(19) 상대적 레이아웃 :

android:layout_toEndOf="@id/view"

(19) 구속 조건 레이아웃 :

app:layout_constraintStart_toEndOf="@id/view"

(20) 상대적 레이아웃 :

android:layout_toRightOf="@id/view"

(20) 구속 조건 레이아웃 :

app:layout_constraintLeft_toRightOf="@id/view"

(21) 상대 레이아웃 :

android:layout_above="@id/view" 

(21) 구속 조건 레이아웃 :

app:layout_constraintBottom_toTopOf="@id/view"

(22) 상대적 레이아웃 :

android:layout_below="@id/view" 

(22) 구속 조건 레이아웃 :

app:layout_constraintTop_toBottomOf="@id/view"


답변

@davidpbr ConstraintLayout 성능에 의해보고

두 개의 유사한 7- 자식 레이아웃을 만들었습니다 . 각각 하나는 부모 ConstraintLayoutRelativeLayout. Android Studio 메소드 추적 도구를 기반으로 ConstraintLayoutonMeasure에 더 많은 시간을 소비하고에서 추가 작업을 수행합니다 onFinishInflate.

사용 된 라이브러리 ( support-v4, appcompat-v7…) :

com.android.support.constraint:constraint-layout:1.0.0-alpha1

기기 / Android 버전 : Samsung Galaxy S6 (SM-G920A. 죄송합니다. Nexus atm은 아님) 안드로이드 5.0.2

빠른 방법 추적 비교 :

샘플 Github 저장소 : https://github.com/OnlyInAmerica/ConstraintLayoutPerf


답변

차이점 / 장점은 다음과 같습니다.

  1. 구속 조건 레이아웃은 선형 레이아웃뿐만 아니라 상대적 레이아웃의 이중 성능을 갖습니다. 상대적 레이아웃과 같은 뷰의 상대적 위치를 설정하고 동적 레이아웃 (선형 레이아웃에서만 가능)의 가중치를 설정합니다.

  2. 매우 강력한 용도는 체인을 형성하여 요소를 그룹화하는 것입니다. 이런 식으로 뷰 그룹을 구성 할 수 있습니다. 뷰 그룹을 구성하기 위해 다른 계층의 계층을 추가하지 않고도 전체적으로 원하는 방식으로 배치 할 수 있습니다.

  3. 가중치 외에도 수평 및 수직 바이어스를 적용 할 수 있으며 이는 중심으로부터의 변위 백분율에 지나지 않습니다. (바이어스 0.5는 중앙 정렬됨을 의미합니다. 모든 값은 각 방향에서의 해당 이동을 의미합니다.)

  4. 또 다른 매우 중요한 기능은 일부 뷰가 Java 코드를 통해 GONE으로 설정된 경우 레이아웃이 중단되지 않도록 GONE 뷰를 처리하는 기능을 존중하고 제공한다는 것입니다. https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior 에서 더 찾을 수 있습니다.

  5. 페이지를 쉽게 디자인 할 수있는 Blue print 및 Visual Editor 도구를 사용하여 자동 구속 조건 적용 기능을 제공합니다.

이러한 모든 기능은 뷰 계층 구조를 평탄화하여 성능을 향상시키고 다양한 화면 크기 및 밀도에보다 쉽게 ​​적응할 수있는 반응 형 동적 UI를 만드는 데 도움이됩니다.

https://codelabs.developers.google.com/codelabs/constraint-layout/#0 빠른 학습을위한 최고의 장소는 다음과 같습니다.


답변

큰 차이점은 ConstraintLayout은 뷰가 없어도 제약 조건을 준수한다는 것입니다. 따라서 체인이 있고 중간에보기를 사라지게하려는 경우 레이아웃이 중단되지 않습니다.


답변

@ dhaval-jivani 답변 외에도.

프로젝트 github 프로젝트를 최신 버전의 제약 조건 레이아웃 v.1.1.0-beta3으로 업데이트했습니다.

onCreate 메소드의 시간과 onCreate 시작과 CPU 모니터에 보이는 마지막 preformDraw 메소드의 실행 종료 사이의 시간을 측정하고 비교했습니다. 모든 테스트는 Android 6.0.1이 설치된 Samsung S5 mini에서 수행되었습니다. 결과 :

새로 시작 (응용 프로그램 시작 후 첫 화면 열기)

상대 레이아웃

OnCreate : 123ms

마지막 프리폼 그리기 시간-켜짐 만들기 시간 : 311.3ms

구속 조건 레이아웃

OnCreate : 120.3ms

마지막 프리폼 그리기 시간-켜짐 만들기 시간 : 310ms

그 외에도이 기사 에서 성능 테스트를 확인했습니다 . 여기 코드 에서는
루프에서 카운트가 100 미만인 구속 레이아웃 변형이 팽창, 측정 및 레이아웃 실행 중 상대적 레이아웃을 사용하는 변형보다 빠릅니다. 그리고 Android 4.3이 설치된 Samsung S3와 같은 오래된 Android 기기에서는 그 차이가 더 큽니다.

결론적으로 나는 기사의 의견에 동의합니다 .

이전 뷰를 리팩터링하는 것이 RelativeLayout 또는 LinearLayout에서 전환합니까?

항상 그렇듯이 : 그것은 달려있다 ?

현재 레이아웃 계층에 성능 문제가 있거나 어쨌든 레이아웃을 크게 변경하지 않는 한 아무것도 리팩터링하지 않습니다. 최근에 측정하지는 않았지만 마지막 릴리스에서 성능 문제를 찾지 못했습니다. 그래서 나는 당신이 그것을 안전하게 사용해야한다고 생각합니다. 그러나 내가 말했듯이 마이그레이션을 위해 마이그레이션하지 마십시오. 필요한 경우에만 혜택을 받으십시오. 그러나 새로운 레이아웃의 경우 거의 항상 ConstraintLayout을 사용합니다. 우리가 이전에했던 것보다 훨씬 낫습니다.


답변

공식적 ConstraintLayout으로 훨씬 빠릅니다

Android의 N 릴리스에서이 ConstraintLayout클래스는와 유사한 기능을 제공 RelativeLayout하지만 비용은 훨씬 저렴합니다.