이 게시물은 다음 링크를 참조하여 학습했습니다.
안드로이드 컨스트레인트레이아웃. (Android ConstraintLayout)
1. 안드로이드 레이아웃 작성. 안드로이드 앱을 개발할 때, UI 화면을 구성하는 작업은 보기만큼(?) 마냥 쉬운 일이 아닙니다. 특히 앱 개발 경험이 상대적으로 부족한 초보 개발자들에겐, 앱의 탐
recipes4dev.tistory.com
Android ConstraintLayout 분석 - 1
이번 글은 ConstraintLayout 에 대한 분석 내용입니다. ConstraintLayout 은 지난 2016 년 개최 되었던...
blog.naver.com
이번 시간에는 ConstraintLayout에 대해 정리해보려 한다.
1. ConstraintLayout
Constraint의 사전적인 의미는 '제약'인데, 여러가지 제약조건들을 이용해서 뷰의 크기와 위치를 결정한다.
여러 종류의 Layout의 특성을 합친 특징을 갖고 있는데,
RelativeLayout의 "상대적인 위치 관계", LinearLayout의 "가중치", Chain의 "요소 그룹화" 등의 특징을 갖고 있다.
1) 제약조건
안드로이드에서 제공하는 ConstraintLayout의 제약 조건은 9가지의 카테고리로 구성되어 있으며,
다음 링크에서 그 카테고리등을 확인 할 수 있다.
ConstraintLayout | Android 개발자 | Android Developers
ConstraintLayout This package is part of the Android support library which is no longer maintained. The Constraint Layout support library has been superseded by the AndroidX Constraint Layout library, which is part of Jetpack. The ConstraintLayout class ha
developer.android.com
ConstLayout 제약조건 분류
카테고리 | 설명 |
Relative positioning | 요소 간 상대 위치 지정 |
Margins | 요소 간 여백 설정 |
Centering positioning and bias | 뷰를 부모 레이아웃 또는 제약 영역의 중앙에 배치 또는 편중 |
Circular positioning | 대상 뷰를 기준으로 각도(angle)와 반지름(radius)으로 상대 위치 지정 |
Visibility behavior | 뷰의 Visibility 상태에 따른 최종 위치 결정 및 여백 |
Dimension constraints | 뷰에 적용된 제약에 따른 뷰의 크기 결정 |
Chains | 수평 또는 수직 방향으로 나열된 뷰에 대한 그룹화. 배치 스타일 지정 |
Virtual Helpers objects | 레이아웃 내 효율적인 뷰 배치에 사용 가능한 몇가지 Helper 객체들 |
Optimizer | 제약 카테고리에 대한 최적화 |
(1) Relative positioning
상대 위치 지정 관련 속성은 다음과 같이 있다.
속성 | 설명 |
layout_constraintLeft_toLeftOf | 뷰의 왼쪽을 대상 뷰의 왼쪽에 맞춤 |
layout_constraintLeft_toRightOf | 뷰의 왼쪽을 대상 뷰의 오른쪽에 맞춤 |
layout_constraintRight_toRightOf | 뷰의 오른쪽을 대상 뷰의 오른쪽에 맞춤 |
layout_constraintRight_toLeftOf | 뷰의 오른쪽을 대상 뷰의 왼쪽에 맞춤 |
layout_constraintTop_toTopOf | 뷰의 위를 대상 뷰의 위에 맞춤 |
layout_constraintTop_toBottomOf | 뷰의 위를 대상 뷰의 아래에 맞춤 |
layout_constraintBottom_toBottomOf | 뷰의 아래를 대상 뷰의 아래에 맞춤 |
layout_constraintBottom_toTopOf | 뷰의 아래를 대상 뷰의 위에 맞춤 |
layout_constraintBaseline_toBottomOf | 뷰의 텍스트 베이스라인을 대상 뷰의 텍스트 베이스라인에 맞춤 |
layout_constraintStart_toStartOf | 뷰의 시작을 대상 뷰의 시작에 맞춤 |
layout_constraintStart_toEndOf | 뷰의 시작을 대상 뷰의 끝에 맞춤 |
layout_constraintEnd_toEndOf | 뷰의 끝을 대상 뷰의 끝에 맞춤 |
layout_constraintEnd_toStartOf | 뷰의 끝을 대상 뷰의 시작에 맞춤 |
다음 속성들은 속성값으로 "parent" 또는 ID값을 사용한다.
(2) Margins
기본적으로 여백을 설정하는 방법은 다른 레이아웃에서와 동일하다.
ConstraintLayout은 layout_margin 외에 대상 View가 보이지 않는 상태(View.GONE)가 되었을 때의 여백 속성도 제공한다.
속성 | 설명 |
layout_goneMarginLeft | 뷰의 왼쪽 대상 뷰가 View.gone 상태일때 여백 설정 |
layout_goneMarginRight | 뷰의 오른쪽 대상 뷰가 View.gone 상태일때 여백 설정 |
layout_goneMarginTop | 뷰의 위쪽 대상 뷰가 View.gone 상태일때 여백 설정 |
layout_goneMarginBottom | 뷰의 아래쪽 대상 뷰가 View.gone 상태일때 여백 설정 |
layout_goneMarginStart | 뷰의 시작쪽 대상 뷰가 View.gone 상태일때 여백 설정 |
layout_goneMarginEnd | 뷰의 끝쪽 대상 뷰가 View.gone 상태일때 여백 설정 |
다음 속성들은 속성값으로 여백 값을 사용한다.
(3) Centering positioning and bias
상대적 제약 조건이 반대방향으로 두 가지가 동시에 적용되면, 뷰는 두 가지 제약의 가운데 배치된다.
이 점을 이용해서 Centering positioning을 할 수 있다.
만약 가운데 위치 시키는 것이 아니라 가운데에서 조금 옆으로 또는 위아래로 배치시키고 싶을때는 어떻게 해야 할까?
ConstraintLayout에는 Bias관련 속성이 있다.
Bias의 사전적 정의는 "치우침", "편중"이다.
Bias 관련 속성은 다음과 같다.
속성 | 설명 |
layout_constraintHorizontal_bias | 수평 방향(Left/Right 또는 Start/End) 사이드 제약 시, 양 사이드 간 위치 비율 |
layout_constraintVertical_bias | 수직 방향(Top/Bottom) 사이드 제약 시, 양 사이드 간 위치 비율 |
다음 속성들은 0에서 1 사이의 소숫값을 속성값으로 갖는다.
(4) Circular positioning
원형 위치 지정은 대상 뷰의 아이디와 거리, 각도 값을 입력하여 나타낼 수 있다.
원형 위치 지정의 속성은 다음과 같다.
속성 | 설명 |
layout_constraintCircle | 대상 뷰의 ID 지정 |
layout_constraintCircleRadius | 뷰와 대상 뷰 중심 사이의 거리 |
layout_constraintCircleAngle | 뷰가 배치될 각도( 각도 계산은 시계처럼 12시 기준, 시계방향이다. ) |
(5) Visiblity behavior
Visiblity behavior 특성은 전에 설명했던 Visibility 특성과, (2) Margins에서 설명한 goneMargin 특성을 포함하고 있으므로 생략한다.
(6) Dimension constraints
Dimension constraints 속성은 위젯의 크기를 조정하는데 유용하게 사용된다.
Dimension constraints 속성을 사용하기 위해서는 0dp(MATCH_CONSTRAINT) 속성 값에 대해서 알아야한다.
일반적으로 길이를 결정할 때 특정 값 또는 "wrap_content", "match_parent" 를 많이 사용했지만,
ConstraintLayout에 속한 뷰들에 대해서는 "match_parent"를 지원하지 않는다.
0dp 속성 값과 (1) Relative positioning, (2) Margins 을 혼합해서 사용하면 뷰의 크기를 자유자재로 조정할 수 있다.
Dimension constraints 속성들은 다음과 같다.
속성 | 설명 | 속성 값 |
layout_constraintDimensionRatio | 뷰의 가로와 세로의 비율을 조정한다. | 비율(n:m) / 방향(h or w), 비율(n:m) |
layout_constrainedWidth | 뷰들이 가로범위 밖으로 안나가도록 조정 | true / false |
layout_constrainedHeight | 뷰들이 세로범위 밖으로 안나가도록 조정 | true / false |
layout_constraintWidth_min | 뷰들의 가로길이 최솟값 설정 | 길이 값 |
layout_constraintHeight_min | 뷰들의 세로길이 최솟값 설정 | 길이 값 |
layout_constraintWidth_max | 뷰들의 가로길이 최댓값 설정 | 길이 값 |
layout_constraintHeight_max | 뷰들의 세로길이 최댓값 설정 | 길이 값 |
layout_constraintWidth_percent | 뷰들의 가로길이를 parent의 percent로 설정 | 비율(n:m) |
layout_constraintHeight_percent | 뷰들의 세로길이를 parent의 percent로 설정 | 비율(n:m) |
(7) Chains
Chains 특성은 가로/세로축에 대해 뷰(View)들을 그룹지을 수 있다.
인접한 뷰끼리 서로 쌍방향 constraint정의 되어 있을 때 chain관계에 있다고 본다.
Chains는 chain head가 있는데 쉽게 생각해서 START와 가까운 위젯이라고 보면 된다.
가로축 기준일때는 Left, 세로축 기준일때는 Top쪽의 뷰가 chain head가 된다.
chain의 style은 head에서 지정할 수 있다.
안드로이드에서 소개하는 체인 스타일은 여섯 종류정도 있지만,
지원하는 chainStyle은 3개이고, 다른 Constraint 조건을 조합해서 소개하는 여섯 종류를 구현할 수 있다.
chainStyle은
CHAIN_SPREAD
CHAIN_SPREAD_INSIDE
CHAIN_PACKED
위 세가지를 지원한다.
체인스타일을 부여하는 속성은 다음과 같다.
설명 | 속성 |
layout_constraintHorizontal_chainStyle | 가로 방향 체인 스타일 설정 |
layout_constraintVertical_chainStyle | 세로 방향 체인 스타일 설정 |
(8) Virtual Helper objects
안드로이드는 ConstraintLayout의 사용을 돕기위해 특별한 객체 몇 가지를 제공하는데, 이것이 Virtual Helper objects이다.
Guideline
실제 어플상에는 출력되지 않지만 레이아웃 작업을 돕기 위한 선을 그려준다.
layout_constraintGuide_percent 속성을 이용해서 0에서 1사이의 소숫값을 입력해서 선의 위치를 결정한다.
Group
특정 뷰(View)들을 묶어서 제어할 수 있다. ( ex) 여러개의 뷰를 한번에 visibility 제어할 때 )
constraint_referenced_ids 속성을 이용해서 속성값을 ID로 입력하는데, ID를 ','로 구분해서 입력한다.
Barrier
참조하고 있는 뷰(View)들 중에 가장 큰 dimension의 position에 Guideline을 생성한다.
barrierDirection 속성을 이용해서 Guideline을 생성할 방향을 결정하고, 속성값을 방향으로 입력한다.
constraint_referenced_ids 속성을 이용해서 속성값을 ID로 입력하는데, ID를 ','로 구분해서 입력한다.
(9) Optimizer
제약 카테고리에 대한 최적화 기능을 한다.
'Legacy' 카테고리의 다른 글
[안드로이드 스튜디오 독학#8] LinearLayout (0) | 2021.01.13 |
---|---|
[안드로이드 스튜디오 정리#1-7] ListView, GridView (0) | 2021.01.13 |
[안드로이드 스튜디오 정리#1-5] DrawerLayout (0) | 2021.01.12 |
[안드로이드 스튜디오 정리#1-4] TableLayout (0) | 2021.01.12 |
[안드로이드 스튜디오 정리#1-3] FrameLayout (0) | 2021.01.11 |