내용 업데이트: 20.09.15
CoordinatorLayout 을 활용한 스크롤 이벤트 구현하기
실행환경 : Android Studio 3.2
API : API 24 Nougat
test device : Galaxy Note 9 (API 28 Oreo)
출처 : material.google.com
스크롤 이벤트에 따라 부드러운 애니메이션과 함께 툴바가 사라지고 보여진다.
이를 구현할 수 있는 기본 레이아웃은 바로 CoordinatorLayout 이다.
아래와 같이 app.gradle 에 디펜던시를 추가해주어야한다.
원래는 support 라이브러리에 따로 존재했지만, androidx 로 업데이트 된 이후로 함께 포함되어있다. 두번째 줄에 있는 머티리얼 디펜던시를 추가해주지않으면, 코디네이터 레이아웃에서 세팅할 수 있는 behavior 가 없으니 잊지말고 꼭 넣어주어야한다.
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
}
코디네이터의 동작 원리를 먼저 알고 넘어가면 좋겠지만, 내용이 많을 수 있기때문에 나중에 따로 포스팅을 할 계획이다.
먼저 Navigation Drawer Activity 로 생성하면 여러개의 xml 레이아웃이 만들어지는데, 아래 4개파일만 살펴보면 된다.
- activity_main.xml
- app_bar_main.xml
- content_main.xml
- nav_header_main.xml
이 중에서 app_bar_main.xml 의 구조를 살펴보면 다음과 같다.
<CoordinatorLayout>
- - <AppBarLayout>
- - - - <Toolbar />
- - <Contents Include />
- - <FloatingActionButton />
최상위 레이아웃은 CoordinatorLayout 이고, 그 안에 AppBarLayout, include 구문, 그리고 FloatingButton이 있다.
이 구조를 아래와 같이 변경해야한다.
최상위 레이아웃 CoordinatorLayout 은 변함 없고
AppBarLayout 안의 CollasingToolbarLayout은 ImageView와 Toolbar를 갖고 있다.
(스크린샷에서는 Collapsing 레이아웃이 닫혀있어서 보이지 않는다. 그리고 RecyclerView가 있지만 실제로는 필요없어서 뺐다)
CollapsingToolbarLayout
CollapsingToolbarLayout 은 FrameLayout을 상속받았고, Toolbar 를 애니메이션을 통해 확장해주는 용도로 사용된다.
우선 기본적인 본문이 들어갈 content_main.xml(위에서 include 된 레이아웃 파일)에 있는 nav_host_fragment 에 그려지게 되는 3개의 프래그먼트(home, gallery, slideshow) 중 home_fragment.xml 로 들어가서 아래와같이 구조를 변경한다.
이 상태로는 본문의 내용이 너무 짧아 스크롤이 발생하지 않기때문에, 아래와같이 뷰의 높이를 강제로 높였다.
그리고 스크롤이 발생하기 위해서는 최상위 레이아웃을 NestedScrollView 로 바꿔야한다. 기본 ScrollView 로는 스크롤링 이벤트를 처리할 수 없기 때문에 NestedScrollView 를 사용했다. 그러면 다음과 같이 구조가 변경된다.
그리고 중요한점은, constraintLayout에 있는 app:layout_behavior="@string/appbar_scrolling_view_behavior" 을 최상위의 NestedScrollView 에 옮겨주어야한다. (그래야 app_bar_main.xml 에서 content_main.xml 이 겹쳐보이지 않는다.)
일단 스크롤은 발생하지만, 원하는 기능은 동작하지 않는다.
이를 위한 다음 작업을 해보자.
우선 다시 app_bar_main.xml 로 돌아와서 CollapsingToolbarLayout 에 layout_scrollFlags 속성을 사용하여 스크롤시 헤더에 대한 적절한 flag를 설정하자.
속성은 다음과 같다.
scroll |
스크롤 이벤트에 반응할 모든 view에 반드시 이 플래그를 설정해야한다. 그렇지 않으면 화면 상단에 고정된다. |
enterAlways |
아래쪽 방향으로 스크롤 할 때마다 이 보기가 표시된다. ('quick return') |
exitUntilCollapsed |
해당 뷰에 minHeight를 정의하고 있으면, Toolbar가 해당 크기까지만 축소된다. (가장 많이 사욤됨) |
enterAlwaysCollased |
해당 뷰에 minHeight 속성의 크기로 시작해 맨 위로 스크롤이 될때만 전체 높이로 확장하게 된다. |
<스킨에 적용된 개행이 넓어서 너무 이상하게 나온다;; 스킨을 변경하도록 하자>
<com.google.android.material.appbar.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="100dp"
app:contentScrim="@android:color/transparent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
그리고 CollapsingToolbarLayout에 app:contentScrim 속성을 사용하여 최소화 되었을때 툴바의 색상을 변경 할 수 있다.
그 다음으로 살펴봐야하는 속성은 app:layout_collapseMode 속성이다.
이 속성은 Toolbar 안에 설정하며, 스크롤이 발생했을 때 Toolbar의 최종 형태를 결정하는 역할을 한다.
이미지를 사용했을 경우, ImageView에도 속성을 넣어주어야 한다.
pin |
CollapsingToolbarLayout이 완전히 축소되면 툴바는 화면위에 고정된다. |
parallax |
툴바가 축소되는 동안 Parallax모드로 동작하도록 한다. 옵션으로 layout_collapseParallaxMultipler 속성을 사용하면 transition의 translation Multiplier를 설정할 수 있다. (예 : app:layout_collapseParallaxMultiplier="0.7") |
<ImageView
android:id="@+id/ivToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:src="@drawable/test"
app:layout_collapseMode="parallax"/>
<androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/AppTheme.PopupOverlay" />
이렇게 하면 스크롤이 발생하며 본문의 내용을 위로 올렸을 때 툴바가 작아지면서 상단에 고정된다.
CollapsingToolbarLayout에서 app:contentScrim="@android:color/transparent" 로 지정하였으므로, 툴바가 닫혔을 때 투명색으로 변해 이미지뷰가 툴바에 보이게 된다. (이렇게하지 않으면 기본 툴바 색으로 나온다.)
아래 스샷의 왼쪽은 스크롤 안한상태, 오른쪽은 모두 한 상태이다.
요약
1. 앱바레이아웃에 collapsingToolbarLayout 추가하고, 스크롤 이벤트 발생 시 어떤 동작을 할지 플래그 설정하기
2. 툴바가 닫혔을 때 어떤 행동을 할지(최종 형태는 어떨지) layout_collapseMode 속성 설정하기
3. include 되는 content_main.xml 를 coordinatorLayout 에서 어떻게 보여줄지 content_main.xml 최상위에서 app:layout_behavior="@string/appbar_scrolling_view_behavior" 설정하기
참고
'Android > Basic' 카테고리의 다른 글
[Android] Socket 통신 예제(New) (0) | 2020.09.28 |
---|---|
[Android] 스플래시 화면 (0) | 2018.09.12 |
[Android] 페이지 슬라이딩 (0) | 2018.09.07 |
[Android] 트윈 애니메이션 (0) | 2018.09.07 |
[Android] 스레드 애니메이션 (0) | 2018.09.07 |