仅在折叠工具栏中的工具栏上捕捉滚动标志

Snap scroll flag only on toolbar in collapsing toolbar

我有一个带有固定工具栏的折叠工具栏,我希望自由折叠工具栏 space 可以自由滚动,但固定工具栏可以快速打开或关闭,我的问题是这可以通过以下方式实现滚动标志或者我是否需要创建自定义布局行为或根据工具栏偏移对标志进行一些禁用和启用以便说明我想要的是一些图像,

我想允许这个例子被完全展开

这将是自由滚动的示例 space(无对齐)

这将是完全滚动的折叠工具栏和固定工具栏

但我永远不想允许这个

这是固定的工具栏,也可以自由滚动(因为它是折叠工具栏的 child)我只希望这个工具栏有一个 snap 的滚动标志,但实际上这不起作用工具栏标志被忽略

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:id="@+id/toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"
        app:titleEnabled="false"
        app:title=""
        app:titleTextColor="@android:color/transparent"
        app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@drawable/squareangle"
            app:titleTextColor="@android:color/transparent"
            app:title=""
            android:elevation="@dimen/large_margin_32dp"
            android:layout_gravity="top"
            android:minHeight="?attr/actionBarSize"
            app:elevation="@dimen/large_margin_32dp"
            app:layout_scrollFlags="snap"
            app:layout_collapseMode="pin"/>

您可以使用

设置滚动标志
toolbarParams.setScrollFlags(SCROLL_FLAG_SCROLL | SCROLL_FLAG_ENTER_ALWAYS)

或者如您所见通过移动 here,这是一个测试工具栏功能的示例 playground。

您还使用

检查 AppbarLayout 偏移量
appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->

    //Check if the view is collapsed
    if (abs(verticalOffset) >= appbar.totalScrollRange) {
        collapsingToolbar.title = "Collapsed"
    } else {
        collapsingToolbar.title = ""
    }

     // Change flags based on position of offset

})

我用它来为 RecyclerView 在 appbar 上创建滚动行为,如图所示 here

感谢 Thracian,我得到了这样的东西

private fun handleAppBarSnapFlag() {
    binding.appBarLayout.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
        if (abs(verticalOffset) >= appBarLayout.totalScrollRange - getToolbarHeight()) {
            val toolbarParams = binding.collapsingToolbar.layoutParams as AppBarLayout.LayoutParams
            toolbarParams.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS or SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED or SCROLL_FLAG_SNAP
        } else {
            val toolbarParams = binding.collapsingToolbar.layoutParams as AppBarLayout.LayoutParams
            toolbarParams.scrollFlags = SCROLL_FLAG_SCROLL or SCROLL_FLAG_ENTER_ALWAYS or SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED
        }
    })
}