[안드로이드] CollapsingToolbarLayout으로 움직이는 상단바 만들기
어제는 안드로이드에서 collapsingToolbarLayout을 이용하여 움직이는 상단바를 만들어보았다.움직이는 상단바를 위해 필요한 xml 구조추가 : CoordinatorLayout안에 자식뷰를 배치하는 방법CoordinatorLayout의
velog.io
CollapsingToolbarLayout
일명 움직이는 상단바로써 상단 앱 바(app bar)내에
1. 접히는 View (주로 이미지뷰)
2. 고정되는 View (주로 Toolbar)
로 구성되는 CollapsingToolbarLayout을 정의한다.
<androidx.coordinatorlayout.widget.CoordinatorLayout
<com.google.android.material.appbar.AppBarLayout
<com.google.android.material.appbar.CollapsingToolbarLayout
<!--parallax: 스크롤 시 접히는 부분-->
<androidx.appcompat.widget.AppCompatImageView
<!--pin : 스크롤 시 고정되는 부분-->
<androidx.appcompat.widget.Toolbar
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
다음과 같은 XML코드가 정의된다.
Attribution
CollapsingToolbarLayout에 쓰이는 Attr을 알아보자.
<CollapsingToolbarLayout>
'layout_scorollFlags' : scoroll // enterAlways // enterAlwaysCollapsed // exitUnitCollapsed
-> 보통 scroll 은 기본으로 들어가고, | 와 함께 뒤에 3가지 속성 중 하나가 함께 쓰인다.
1.scoroll : 해당 뷰가 화면에서 사라질 수 있게 설정. 만약 설정되지 않으면 해당 뷰는 화면에 항상 남아있다.
2.enterAlways : scoroll 옵션과 같이 사용될 때 아래에서 위(↑)로 스크롤 하는 경우 해당 뷰는 사라지고, 위에서 아래(↓)로 스크롤 하는 경우 다시 나타난다.
3.enterAlwaysCollapsed : enterAlways랑 유사하지만, 위에서 아래(↓)로 스크롤할 때 다르다.
위에서 아래(↓)로 스크롤 할때 스크롤 되는 리스트의 끝에 도달했을 때만 해당 뷰가 다시 나타난다.
만약 minHeight 속성이 같이 설정되어있다면, 해당 값에 스크롤이 도달했을 때 뷰가 나타난다.
사용 예시) layout_scorollFlags = "scoroll | enterAlways | enterAlwaysCollapsed"
4.exitUntilCollapsed : 이 값이 설정되면 아래에서 위(↑)로 스크롤하는 동안 해당 뷰는 사라진다. 위에서 아래(↓)로 스크롤 하더라도 뷰 끝까지 올려야 해당 뷰가 나타난다.
만약 해당 뷰에 minHeight가 정의되어 있다면, Toolbar가 축소될 때 해당 크기 까지만 축소된다.
-> minHeight는 잘모르겠다 적용이안된다.
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:collapsedTitleTextColor="@color/white"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<CollapsingToolbarLayout> 의 Child View
"layout_collapseMode" : parallx // pin
1.pin : CollapsingToolBarLayout이 완전히 축소되면 툴바는 화면위에 고정된다.
2.parallx : 툴바가 축소되는 동안 parallax 모드로 동작한다.
+ layout_collapseParallaxMultipler 속성을 사용하면 transition의 translation Multiplier를 설정 할 수있다.
+ app:contentScrim 속성을 사용하여 최소화 되었을 때 툴바의 색상을 변경할 수 있다.
<!--parallax: 스크롤 시 접히는 부분-->
<androidx.appcompat.widget.AppCompatImageView
android:src="@drawable/summer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
app:layout_collapseMode="parallax"/>
<!--pin : 스크롤 시 고정되는 부분-->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
app:title="여름"
app:titleTextColor="@color/white"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:menu="@menu/menu_main_activity"
app:layout_collapseMode="pin"/>
CoordinatorLayout
FrameLayout의 특징을 갖는 레이아웃으로써 자식뷰끼리 겹쳐보일 수 있다.
CoordinatorLayout의 자식뷰에 *behavior를 지정할 수 있다.
*behavior란?
behavior는 스크롤, 드래그, 스와이프 등 뷰의 다양한 움직임이나 애니메이션에 따른 상호작용을 구현하기 위해
사용된다.
이 CoordinatorLayout의 behavior속성을 이용하여 뷰페이저 스크롤 시에 상단 바가 반응하도록 만들 수 있다.
※만약 layout_behavior가 정의되어 있지 않다면 아무리 스크롤을 해도 상단 앱 바는 아무런 반응을 하지 않는다.
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
behavior는 custom 도 가능. 다음 블로그 포스팅 주제로 해보자.
소스코드
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
</data>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:collapsedTitleTextColor="@color/white"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--parallax: 스크롤 시 접히는 부분-->
<androidx.appcompat.widget.AppCompatImageView
android:src="@drawable/summer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
app:layout_collapseMode="parallax"/>
<!--pin : 스크롤 시 고정되는 부분-->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
app:title="여름"
app:titleTextColor="@color/white"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:menu="@menu/menu_main_activity"
app:layout_collapseMode="pin"/>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>
https://github.com/ranseo/CollapsingToolbarLayoutExample.git
'안드로이드' 카테고리의 다른 글
[Android/Kotlin] 대화상자 Dialog (2) 미리 정의된 대화상자 : DatePickerDialog & TimePickerDialog - 1 (0) | 2022.05.31 |
---|---|
[Android/Kotlin] NavigationView itemSeletedListener 설정하기. (0) | 2022.05.27 |
[Android/Kotlin] 앱 바 App bar (3) NavigationUI와 App bar (0) | 2022.05.23 |
[Android/Kotlin] 앱 바 App bar (2) App bar와 Fragment (0) | 2022.05.20 |
[Android/Kotlin] safe-args, fragment간 navigation을 통해 인자를 주고 받기. (0) | 2022.05.18 |