【问题标题】:Reverse HideBottomViewOnScrollBehavior and initialize to hide state android反转 HideBottomViewOnScrollBehavior 并初始化隐藏状态 android
【发布时间】:2021-08-23 08:46:03
【问题描述】:

我有一个带有 RecyclerView 和 Fab 按钮的 CoordinatorLayout。

<androidx.coordinatorlayout.widget.CoordinatorLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
                    android:id="@+id/swipeChatRoomRecycler"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
                    <androidx.recyclerview.widget.RecyclerView
                        android:id="@+id/chatRoomRecycler"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:clipToPadding="true"
                        android:scrollbars="vertical" />
                </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

                <com.google.android.material.floatingactionbutton.FloatingActionButton
                    android:id="@+id/bottomScrollFab"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom|end"
                    android:layout_margin="12dp"
                    android:src="@drawable/ic_arrow_down"
                    app:backgroundTint="@color/colorPrimaryLight"
                    app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"
                    app:layout_anchor="@id/swipeChatRoomRecycler"
                    app:layout_anchorGravity="bottom|right|end"
                    app:fabSize="mini" />
            </androidx.coordinatorlayout.widget.CoordinatorLayout>

recyclerView设置如下

viewManager = LinearLayoutManager(activity).apply {
            orientation = LinearLayoutManager.VERTICAL
            stackFromEnd = false
            reverseLayout = true
        }

我想要实现的是

  1. 在活动启动时,我希望 bottomScrollFab 不可见,因为默认情况下回收器最终滚动
  2. 我想实现完全相反的行为,这意味着我希望 Fab 在回收器未 onScroll 时显示,并在回收器 onScroll 时隐藏

这两件事我该怎么做?

【问题讨论】:

    标签: android android-recyclerview android-coordinatorlayout material-components-android


    【解决方案1】:

    到目前为止,我已经创建了一个自定义行为,它会在滚动回收器时更改 alpha。效果很好

    class ReverseHideViewOnScrollBehaviour(context: Context, attributeSet: AttributeSet): CoordinatorLayout.Behavior<View>(context, attributeSet) {
    
        override fun layoutDependsOn(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
            return dependency is RecyclerView
        }
    
        override fun onDependentViewChanged(parent: CoordinatorLayout, child: View, dependency: View): Boolean {
            val yPercentage = getViewOffsetFromRecycler(parent, child)
            val diff = 100.0f - yPercentage
            child.alpha = 1 - diff
            return true
        }
    
        private fun getViewOffsetFromRecycler(parent: CoordinatorLayout, view: View): Float{
            var percentage = 100f
            val dependencies = parent.getDependencies(view)
    
            dependencies.forEach { dependency ->
                if (dependency is SwipeRefreshLayout) {
                    val recycler = (dependency.findViewById<RecyclerView>(R.id.chatRoomRecycler))
                    val offset: Int = recycler.computeVerticalScrollOffset()
                    val extent: Int = recycler.computeVerticalScrollExtent()
                    val range: Int = recycler.computeVerticalScrollRange()
                    percentage = if (range - extent == 0) 100f else 100.0f * offset / (range - extent).toFloat()
                }
            }
    
            return percentage
        }
    }
    

    所以 FloatinActionButton

    <com.google.android.material.floatingactionbutton.FloatingActionButton
                        android:id="@+id/bottomScrollFab"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="bottom|end"
                        android:layout_margin="12dp"
                        android:src="@drawable/ic_arrow_down"
                        app:layout_behavior=".ui.views.ReverseHideViewOnScrollBehaviour"
                        app:layout_anchor="@id/swipeChatRoomRecycler"
                        app:layout_anchorGravity="bottom|right|end"
                        app:fabSize="mini" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2019-05-08
      • 2023-03-02
      相关资源
      最近更新 更多