这篇博客记录在开发中使用 CoordinatorLayout、AppBarLayout 、CollapsingToolbarLayout实现监听滑动悬停的触顶提示,有不理解的小伙伴可移步之前的文章——安卓开发中上滑触顶悬停
上述三个控件的结构图如下,在滑动时需要触顶的部分需要在 AppBarLayout 、CollapsingToolbarLayout 之间,我们现在需要在实现监听触顶从而实现在触顶之后的某种操作
这篇博客文章探讨了在安卓开发过程中,如何利用 CoordinatorLayout、AppBarLayout 和 CollapsingToolbarLayout 这三个组件来实现滑动时的触顶悬停监听功能。对于那些对这一概念不太熟悉的朋友,可以参考我之前的文章——《安卓开发中的上滑触顶悬停技巧》。
这三个控件的层级结构如下所示。在滑动操作中,需要实现触顶效果的部分应当位于 AppBarLayout 和 CollapsingToolbarLayout 之间。我们的目标是实现一个监听机制,以便在用户滑动触顶时触发特定的操作。
废话不多说,直接上代码
//判断会员权益tab是否到顶部(会员)
private fun checkTabTop(isVipExpires:Boolean) {
val appBarLayout = mDatabind.scVipAppBar
val scVipTab = mDatabind.scVipTab
//verticalOffset 是一个表示从 AppBarLayout 的原始位置向下滚动的像素值的整数。正值表示向下滚动,负值表示向上滚动。
appBarLayout.addOnOffsetChangedListener { _, verticalOffset ->
AppLogTask.get().pushEventLog(
"AppBarLayout",
"Offset: $verticalOffset,scVipTab:${scVipTab.top}"
)
//当verticalOffset + scVipTab.top和为0时就是tab到顶部的位置了
//scVipTab.top的值是常量
val isAtTop = verticalOffset + scVipTab.top == 0
updateTabVisibility(isAtTop, isVipExpires)
}
}
这段代码用于检测一个名为 scVipTab 的 UI 组件(我用的是一个 imageView 组件)是否随着 AppBarLayout 的滚动而到达顶部。这个检测依赖于 AppBarLayout 的滚动偏移量 verticalOffset。以下是对这段代码的详细解释:
1、变量初始化
- 通过数据绑定获取 AppBarLayout 的实例。AppBarLayout 是一个可滚动的顶部应用栏,通常包含 Toolbar 或其他视图组件。
- 通过数据绑定获取名为 scVipTab 的 UI 组件的实例,这可能是一个是一个 imageView 组件。
2、滚动监听器 appBarLayout.addOnOffsetChangedListener { _, verticalOffset -> ... }:为 AppBarLayout 添加一个滚动偏移变化监听器。当 AppBarLayout 滚动时,会触发这个监听器。
3、日志记录:AppLogTask.get().pushEventLog("......."):记录当前的滚动偏移量 verticalOffset 和 scVipTab 的顶部位置 top。这有助于调试和监控滚动行为。
4、触顶判断 val isAtTop = verticalOffset + scVipTab.top == 0:计算 AppBarLayout 的滚动偏移量 verticalOffset 加上 scVipTab 的顶部位置 top 是否等于 0。如果等于 0,表示 scVipTab 已经滚动到顶部,然后执行需要的操作就完事儿了!