Hello,

kok nae-ga ha-myun an-dweneun MAGIC...🧚

안드로이드

CoordinatorLayout Behavior 사용기

✿도담도담 2018. 4. 21. 16:49


이전에 만든 이화면에서 ExpandableListView 부분을 올리면

지도가 사라지는 것을 구현하고 싶었다.


또 열심히 검색해서 찾아낸 친구는

CoordinatorLayout이라는 아이다.


페이스북, 구글 플레이 스토어 처럼

위, 아래로 드래그 시 특정 부분이 나타나고 사라지게 할 수 있다.


CoordinatorLayout안에 NestedScrollView라는 친구들 둬서

스크롤 뷰를 위로 올리면 CoordinatorLayout에 다른 뷰들이

얼마나 올라갔는지를 알아 내서 레이아웃이 변경 되는 것 같다

( 정확히 잘 모르겠다 😭 )


아래 구현한 화면이다.




구글에 수많은 CoordinatorLayout과 Behavior의 소스를 다운 받고

원하는 방향대로 써보려 했지만

초보자인 나에겐 너무 어려워서...

저번처럼 응용하기 쉬운...기본 틀을 사용했다 ㅎ...


저번처럼 res > layout > (오른쪽 클릭)activity에서

사용할 scroll activity 선택 한다.



그러면 두개의 layout xml이 생긴다.


activity_main.xml 부분이다.



app_bar의 툴바 부분에 mapView를 넣어주었다.

그리고 아래에 있는 툴바의 크기가

위로 드래그 했을 시 사라지지 않고 남아 있는 ? 부분이다.


<android.support.v4.widget.NestedScrollView 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:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.mini_mo.viewpager.ScrollingActivity"
tools:showIn="@layout/activity_mainpage">

<com.mini_mo.viewpager.ExpandableListView.AnimatedExpandableListView
android:id="@+id/expandableListView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="10dp"
android:layout_weight="6"
android:groupIndicator="@android:color/transparent" />
</android.support.v4.widget.NestedScrollView>


그리고 content_main.xml 을 보면 NestedScrollView 안에

있던 linearLayout부분을 기존에 있던 ExpandableListView로 바꾸었다.

이때 스크롤 문제때문에 ExpandableListView부분에 onMeasure 메소드를 만들었는데

그래도 레이아웃 계산 문제 때문인지

버벅거림이 있어서 추후 바꿀 예정이다.


public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> {
private static final boolean SNACKBAR_BEHAVIOR_ENABLED;

// 스낵바가 움직일 때 OR 사용자가 스크롤 시 실행
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return SNACKBAR_BEHAVIOR_ENABLED && dependency instanceof Snackbar.SnackbarLayout;
}
// layoutDependsOn이 true를 반환할 시 호출
// 동작 구현 메소드
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
child.setTranslationY(translationY);
return true;
}

static {
SNACKBAR_BEHAVIOR_ENABLED = Build.VERSION.SDK_INT >= 11;
}
}


그리고 Behavior부분이다.


behavior 는 view 에 의존하여 어떤뷰의 행동에 따라 위젯을 변경하는 친구다.

드래그시 높이를 변경 해주도록 되어 있다.


기본 제공 하는 틀을 가지고 만진거라 허접하다ㅠㅠ...

언젠가는 다른 분들처럼 원하는 것들을 구현 할 수 있기를 🤗