MotionLayout은 앱에서 모션과 위젯 애니메이션을 관리하는 데 사용할 수 있는 레이아웃 유형입니다.
MotionLayout은 ConstraintsLayout의 서브클래스이며 ConstraintsLayout의 다양한 레이아웃 기능을 기초로 합니다.
Constraints 라이브러리의 일부인 MotionLayout은 지원 라이브러리로 사용 가능하며, API레벨 14와 호환됩니다.
1. ConstraintLayout 종속 항목 추가: 프로젝트에서 MotionLayout을 사용하려면 ConstraintLayout 2.0 종속 항목을 앱의 build.gradle 파일에 추가합니다. AndroidX를 사용 중이라면 다음 종속 항목을 추가하세요.
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta1'
}
2. MotionLayout 파일 만들기: MotionLayout은 ConstraintLayout의 서브클래스이므로 다음 예에서와 같이 레이아웃 리소스 파일에서 클래스 이름을 바꿔 기존 ConstraintLayout을 MotionLayout으로 전환할 수 있습니다.
<!-- before: ConstraintLayout -->
<androidx.constraintlayout.widget.ConstraintLayout .../>
<!-- after: MotionLayout -->
<androidx.constraintlayout.motion.widget.MotionLayout .../>
<?xml version="1.0" encoding="utf-8"?>
<!-- activity_main.xml -->
<androidx.constraintlayout.motion.widget.MotionLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/motionLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/scene_01"
tools:showPaths="true">
<View
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:background="@color/colorAccent"
android:text="Button" />
</androidx.constraintlayout.motion.widget.MotionLayout>
3. MotionScene 만들기: 이전 MotionLayout 예에서 app:layoutDescription 속성은 MotionScene을 참조합니다. MotionScene은 상응하는 레이아웃의 모든 모션 설명을 포함하는 XML 리소스 파일입니다. 레이아웃 정보를 모션 설명과 별도로 유지하기 위해 각 MotionLayout에서 개별 MotionScene을 참조합니다. MotionScene의 정의는 MotionLayout의 비슷한 정의보다 우선합니다.
다음은 그림 1의 기본 가로 모션을 설명하는 MotionScene 파일의 예입니다.
<?xml version="1.0" encoding="utf-8"?>
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetStart="@+id/start"
motion:constraintSetEnd="@+id/end"
motion:duration="1000">
<OnSwipe
motion:touchAnchorId="@+id/button"
motion:touchAnchorSide="right"
motion:dragDirection="dragRight" />
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint
android:id="@+id/button"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginEnd="8dp"
motion:layout_constraintBottom_toBottomOf="parent"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
</ConstraintSet>
</MotionScene>
- <Transition>에는 모션의 기본 정의가 포함되어 있습니다.
- motion:constraintSetStart 및 motion:constraintSetEnd는 모션의 엔드포인트 참조입니다. 이러한 엔드포인트는 나중에 MotionScene의 <ConstraintSet> 요소에 정의됩니다.
- motion:duration은 모션이 완료되는 데 걸리는 시간을 밀리초 단위로 지정합니다.
- <OnSwipe>를 사용하면 터치를 통해 모션을 제어할 수 있습니다.
- motion:touchAnchorId는 스와이프하고 드래그할 수 있는 뷰를 나타냅니다.
- motion:touchAnchorSide는 오른쪽에서 보기를 드래그하는 것을 나타냅니다.
- motion:dragDirection은 드래그의 진행 방향을 나타냅니다. 예를 들어 motion:dragDirection="dragRight"는 오른쪽으로 드래그하면 진행률이 증가한다는 의미입니다.
- <ConstraintSet>를 통해서는 모션을 설명하는 다양한 제약조건을 정의합니다. 이 예에서는 모션의 엔드포인트마다 한 개씩 ConstraintSet를 정의합니다. 이 엔드포인트는 세로로는 가운데에 위치합니다(app:layout_constraintTop_toTopOf="parent" 및 app:layout_constraintBottom_toBottomOf="parent" 사용). 가로로는 화면의 맨 왼쪽과 오른쪽에 엔드포인트가 있습니다.
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] 꺾은 선 그래프 만들기 (0) | 2022.02.12 |
---|---|
[JAVA][Android] [안드로이드] Volley+를 이용해서 서버에 파일 업로드하기 (0) | 2022.02.11 |
[JAVA][Android] Flexbox Layout 사용해보기 (0) | 2022.02.06 |
[JAVA][Android]사라지는 AppBar 구현하기 (0) | 2022.02.05 |
[Java][Android] 바인드서비스로 데이터 받기 (0) | 2022.02.02 |