State ListAnimatior 스크롤을 사용하여 Toolbar의 elevation 변경

6458 단어 Android

Overview



Toolbar 아래에 있는 ScrollView와 RecyclearView를 스크롤할 때 Toolbar의 그림자를 더하려고 할 때 설치합니다.
Toolbar의 StateListAnimator와 ScrollView의 canScrollVertically()를 사용하여 실현합니다.

1. Object Animator 만들기


제작 상태가 selected로 변할 때 elevation을 변화시키는 ObjectAnimatior.
res/animator/toolbar_elevation.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true">
        <objectAnimator
            android:duration="200"
            android:propertyName="elevation"
            android:valueTo="4dp"
            android:valueType="floatType" />
    </item>

    <item>
        <objectAnimator
            android:duration="200"
            android:propertyName="elevation"
            android:valueTo="0dp"
            android:valueType="floatType" />
    </item>

</selector>

2. Toolbar에서 Object Animator 설정


작성된 Object Animatior를 Toolbar에 설정합니다.
res/layout/{layout_name}.xml
<androidx.appcompat.widget.Toolbar
    ...
    android:stateListAnimator="@animator/toolbar_elevation" />

3. 툴바 상태 변경


ScrollView/RecyclearView의 canscrollVertically () 값으로 Toolbar 상태를 변경합니다.
ActivityorFragment.kt
binding.scrollView.viewTreeObserver.addOnScrollChangedListener {
    // -1をセットすると、スクロール位置が一番上の時のみtrueになる
    isSelected = binding.scrollView.canScrollVertically(-1)
}
이렇게 스크롤하면 Toolbar의 선택 상태가 변경되고 elevation도 변경됩니다.

DataBinding Tips


스타일과 DataBinding의 Custom Binding Adapter를 사용하여 공통화할 수도 있습니다.
res/values/styles.xml
<style name="Toolbar.NoShadow" parent="Widget.AppCompat.Toolbar">
    <item name="android:elevation">0dp</item>
    <item name="android:stateListAnimator">@animator/toolbar_elevation</item>
</style>
ToolbarBindingAdapters.kt
@BindingAdapter("shadowAnimationScrollViewId")
fun Toolbar.setShadowAnimationScrollViewId(@IdRes scrollViewId: Int) {
    val scrollView = this.rootView.findViewById<View>(scrollViewId)
    if (scrollView is ScrollView) {
        scrollView.viewTreeObserver.addOnScrollChangedListener {
            isSelected = scrollView.canScrollVertically(-1)
        }
    }
}
layout/{layout}.xml
<android.support.v7.widget.Toolbar
    ...
    style="@style/Toolbar.NoShadow"
    app:shadowAnimationScrollViewId="@{R.id.scroll}" />

<ScrollView
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    ...
</ScrollView>

좋은 웹페이지 즐겨찾기