滚动时折叠标题而不使用CollapsingToolbarLayout

时间:2018-04-16 21:02:42

标签: android android-layout kotlin

我正在尝试实现与CollapsingToolbarLayout相同的行为,以便我的recyclelerview上方的视图在向下滚动时折叠到最小高度,并在滚动到达顶部时恢复到其正常高度。此标头不是工具栏,因此是自定义视图。

我设法做到了,但是当向上滚动它会恢复高度但整个视图开始闪烁。

这是标题布局,我试图让Textview消失,同时保持内部线性布局始终可见:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center">
      <TextView
        android:id="@+id/welcome_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="12dp"
        android:text="welcome"/>
        <LinearLayout
            android:id="@+id/always_show"
            android:layout_width="match_parent"
            android:layout_height="36dp"
            android:orientation="horizontal"
            android:gravity="center_vertical"
            android:layout_margin="12dp">
            ...
        </LinearLayout>
</LinearLayout>

这是代码

var maxHeight: Int = 0
var initialSize = false

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    ...

     header.getViewTreeObserver().addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            if (initialSize)
                return
            initialSize = true
            maxHeight = header.measuredHeight
        }
    })

       recyclerView.addOnScrollListener(object: RecyclerView.OnScrollListener() {

        override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            if (dy > 0) {
                //scroll down
                val params = header.layoutParams as LinearLayout.LayoutParams
                params.topMargin = Math.max(params.topMargin-dy, -maxHeight/2)
                header.layoutParams = params
            } else if (layoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
                //top
                val params = header.layoutParams as LinearLayout.LayoutParams
                params.topMargin = 0
                header.layoutParams = params                 
            }
        }
    })

}

有关如何使此动画更自然,最接近CollapsingToolbarLayout行为的任何想法。

0 个答案:

没有答案