2018 DroidKnights에 참가하여 지금은 Constraint layout 시대라는 주제로 진행하였던 발표내용을 참고하여 작성하였습니다.
ConstraintLayout이란?
복잡한 레이아웃을 단순한 계층구조를 이용하여 표현할 수 있는 ViewGroup
형제 View들과의 관계를 정의해서 레이아웃을 구성하여, RelativeLayout과 비슷하지만 더 유연하고 다양하고 강력한 기능을 제공한다.
- RelativeLayout에서 불가능했던 자식 뷰간의 상호관계 정의가 가능
- LinearLayout을 써야만 했던 뷰 비율 조정도 간단하게 가능
- 뷰 계층을 간단하게 구성하여 유지보수, 성능 향상
<Button android:id="@+id/buttonA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button_A"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
다른 뷰나 부모 레이아웃과의 정렬 조건 / 연결 관계를 나타냄
layout_constraint[기준1]_to[기준2]of="[viewId|parent]"
[기준1]의 방향을 [기준2]의 방향 위치에 정렬
※ Top/Bottom/Left/Right를 모두 선언해야 하는 것은 아니지만 체인등 다른 기능 사용시 예상 못한 동작이 발생할 수 있어 4방향 모두 선언하는 것을 권장
● 뷰 크기
match_parent는 사용하지 않는 것을 권장
match_parent가 아닌 match_constraint (0dp로 선언 -> match_constraint라고 읽음)
match_constraint 는 가능한 영역을 모두 채운다.
<Button
android:layout_width="150dp"
android:layout_height="0dp"
android:text="button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
● 뷰 크기 - 가로/세로 비율 지정
dimensionRatio : 뷰의 가로/세로 비율 결정
app:layout_constraintDimensionRatio="1" → 가로/세로 = 1/1
app:layout_constraintDimensionRatio="1:1" → 가로:세로 = 1:1
적어도 한 방향은 match_constraint 여야 한다.
두 방향 모두 match_constraint 일 경우, 비율에 맞춰 constraint 내에서 가장 큰 크기로 설정
<Button
android:layout_width="100dp"
android:layout_height="0dp"
android:text="button"
app:layout_constraintDimensionRatio="1"
.../>
<Button
android:layout_width="100dp"
android:layout_height="0dp"
android:text="button"
app:layout_constraintDimensionRatio="2"
.../>
● 뷰 크기 - 최소/최대
최소/최대 크기 지정 : app:layout_constraintWidth_[min|max]="size"
android:minWidth와 다른점
wrap_content => android:[min|max]width 적용
match_constraint => app:layout_constraintWidth_[min|max] 적용
● 뷰 위치 지정 - bias
bias: (constraint 영역 크기 - 뷰 크기) 를 분배하는 비율
app:layout_constraintHorizontal_bias="0~1"
※ 0: 왼쪽에 붙이기 / 1: 오른쪽에 붙이기 / 0.5: 중간에 위치 (기본값)
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button1"
app:layout_constraintHorizontal_bias="0"
... />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button2"
app:layout_constraintHorizontal_bias="1"
... />
● 뷰 위치 지정 - guideline
가로 또는 세로 축 방향을 가진 가상의 뷰
부모 뷰의 특정 위치를 기준점으로 삼을 때 사용
축, 위치 값을 속성으로 가짐
축: android:orientation="[vertical|horizontal]"
위치:
app:layout_constraintGuide_begin: 시작 지점으로 부터의 거리
app:layout_constraintGuide_end: 끝 지점으로 부터의 거리
app:layout_constraintGuide_percent: 시작 지점으로 부터의 % 위치
<android.support.constraint.Guideline
android:id="@+id/gd_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp" />
<android.support.constraint.Guideline
android:id="@+id/gd_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_end="50dp" />
<android.support.constraint.Guideline
android:id="@+id/gd_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.8" />
<Button
android:layout_width="0dp"
android:layout_height="0dp"
android:text="button1"
app:layout_constraintBottom_toTopOf="@id/gd_bottom"
app:layout_constraintLeft_toRightOf="@id/gd_left"
app:layout_constraintRight_toLeftOf="@id/gd_right"
app:layout_constraintTop_toTopOf="parent" />
참고자료: https://www.slideshare.net/kingori/constraint-layout-94663983
'모바일 프로그래밍 > 안드로이드' 카테고리의 다른 글
RecyclerView의 scrollToPosition나 smoothScrollToPosition 사용 시 Item사이의 margin이 있는 경우 (0) | 2019.05.10 |
---|---|
코틀린 접근 제한자 (Visibility Modifiers): private, protected, internal, public (0) | 2019.04.19 |
Dagger2에서 발생하는 java.lang.IllegalArgumentException: No injector factory bound for Class 에러 (0) | 2019.04.18 |
안드로이드 간단히 View 움직이게 하기 (Drag and Drop) (0) | 2019.04.12 |
Android] Retrofit을 이용한 토큰 인증 방식 구현 (1) | 2018.04.03 |