나는 사이의 차이에 대해 혼란 스러워요 ConstraintLayout
와 RelativeLayout
. 누군가가 그들 사이의 정확한 차이점을 말해 줄 수 있습니까?
RealtiveLayout
, LinearLayout
, GridLayout
그들이 원하는 뷰 계층 구조를 얻을 수를 등).
나는 사이의 차이에 대해 혼란 스러워요 ConstraintLayout
와 RelativeLayout
. 누군가가 그들 사이의 정확한 차이점을 말해 줄 수 있습니까?
RealtiveLayout
, LinearLayout
, GridLayout
그들이 원하는 뷰 계층 구조를 얻을 수를 등).
답변:
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- 자식 레이아웃을 만들었습니다 . 각각 하나는 부모 ConstraintLayout
와 RelativeLayout
. Android Studio 메소드 추적 도구를 기반으로 ConstraintLayout
onMeasure에 더 많은 시간을 소비하고에서 추가 작업을 수행합니다 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
차이점 / 장점은 다음과 같습니다.
구속 조건 레이아웃은 선형 레이아웃뿐만 아니라 상대적 레이아웃의 이중 성능을 갖습니다. 상대적 레이아웃과 같은 뷰의 상대적 위치를 설정하고 동적 레이아웃 (선형 레이아웃에서만 가능)의 가중치를 설정합니다.
매우 강력한 용도는 체인을 형성하여 요소를 그룹화하는 것입니다. 이런 식으로 뷰 그룹을 구성 할 수 있습니다. 뷰 그룹을 구성하기 위해 다른 계층의 계층을 추가하지 않고도 전체적으로 원하는 방식으로 배치 할 수 있습니다.
가중치 외에도 수평 및 수직 바이어스를 적용 할 수 있으며 이는 중심으로부터의 변위 백분율에 지나지 않습니다. (바이어스 0.5는 중앙 정렬됨을 의미합니다. 모든 값은 각 방향에서의 해당 이동을 의미합니다.)
또 다른 매우 중요한 기능은 일부 뷰가 Java 코드를 통해 GONE으로 설정된 경우 레이아웃이 중단되지 않도록 GONE 뷰를 처리하는 기능을 존중하고 제공한다는 것입니다. https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#VisibilityBehavior 에서 더 찾을 수 있습니다.
페이지를 쉽게 디자인 할 수있는 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을 사용합니다. 우리가 이전에했던 것보다 훨씬 낫습니다.
실제 질문은 제약 조건 레이아웃 이외의 레이아웃을 사용해야 할 이유가 있습니까? 나는 대답이 '아니오'라고 믿는다.
그들은 초보자 프로그래머 등을 겨냥한 사람들에게 다른 레이아웃보다 열등한 이유를 제공해야합니다.
제약 사항 레이아웃은 모든면에서 더 좋습니다 (APK 크기는 150k와 같습니다). 그것들은 더 빠르고, 더 쉬우 며, 더 유연하고, 변화에 더 잘 반응하고, 아이템이 사라질 때 문제를 해결하고, 근본적으로 다른 화면 유형에 더 잘 부합하며 그 긴 중첩 루프를 사용하지 않습니다. 모든 것을위한 트리 구조를 도출했습니다. 당신은 어디에나, 무엇이든, 어디에나 넣을 수 있습니다.
2016 년 중반에 시각적 레이아웃 편집기가 충분하지 않은 약간 까다 롭습니다. 그러나 레이아웃이 전혀 없다면 제약 조건 레이아웃 사용을 진지하게 고려하고 싶을 수도 있습니다. 그것과 같은 일을 RelativeLayout
하거나 심지어 간단한 일을 할 때 LinearLayout
. FrameLayouts
분명히 여전히 목적이 있습니다. 그러나 지금은 다른 것을 만드는 것을 볼 수 없습니다. 그들이 이것으로 시작했다면 그들은 다른 것을 추가하지 않았을 것입니다.
내가 할 수있는 결론은
1) 우리는 코드 의 XML 부분 을 건드리지 않고 UI 디자인을 할 수 있습니다. 솔직히 말해서 Google이 iOS 앱에서 UI가 어떻게 디자인되었는지 복사했다고 생각 합니다 .iOS의 UI 개발에 익숙하지만 상대적 레이아웃에서는 XML 디자인을 건드리지 않고 제약 조건을 설정하기가 어렵습니다 .
2) 둘째로 다른 레이아웃과 달리 평면보기 계층 구조를 가지므로 다른 답변에서 볼 수있는 상대 레이아웃보다 성능 이 뛰어 납니다.
3) 또한 상대 레이아웃 에서 할 수없는 특정 각도로 특정 반경에서 다른 뷰를 배치 할 수있는 원형 상대 위치 지정 과 같이 상대 레이아웃과 다른 추가 요소 가 있습니다.
다시 말하지만 제약 레이아웃을 사용하여 UI를 디자인하는 것은 iOS에서 UI를 디자인하는 것과 같습니다. 따라서 iOS에서 작업하는 경우 제약 레이아웃을 사용하면 더 쉽게 찾을 수 있습니다
내가 주목 한 유일한 차이점은 드래그 앤 드롭을 통해 상대 레이아웃에서 설정된 것들이 자동으로 다른 요소와 관련된 크기를 가지므로 앱을 실행할 때 얻는 것이 무엇인지입니다. 그러나 구속 조건 레이아웃에서는 디자인보기에서 요소를 끌어서 놓더라도 앱을 실행할 때 상황이 바뀔 수 있습니다. 이는 구속 조건을 수동으로 설정하거나 컴포넌트 트리에서 요소를 마우스 오른쪽 버튼으로 클릭하고 구속 조건 레이아웃 하위 메뉴를 선택한 다음 '구속 조건 추론'을 클릭하여보다 위험한 이동으로 쉽게 해결할 수 있습니다. 도움이 되었기를 바랍니다