OverScroll弹性滚动和惯性滚动效果的实现原理——CoordinatorLayout+Behavior

本文探讨了如何使用CoordinatorLayout和Behavior实现类似微信首页的弹性滚动和惯性滚动效果,涉及关键方法如fling和Over Scroll处理。通过自定义Behavior,支持水平和垂直方向的滑动,并在滑动结束时通过ValueAnimator动画将列表恢复原位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面介绍了OverScroll的使用,没看过文章的同学可以先了解下《类似微信首页弹性滚动和惯性滚动效果的实现——OverScroll》

接下来介绍OverScroll的实现原理。

CoordinatorLayout

CoordinatorLayout是在Support 包中功能强大的布局容器,它本质是一个 FrameLayout,然而它允许开发者通过自定义Behavior协调各个子view,实现各种复杂酷炫的UI交互效果。

使用CoordinatorLayout需要在 build.gradle 加入:

implementation 'com.android.support:design:26.1.0'

网上很多关于CoordinatorLayout的入门文章,这里笔者不再赘述,所谓实践大于理论,本文讲述如何利用CoordinatorLayout+Behavior实现弹性滑动和惯性滑动,从侧面去理解它的使用原理.

本文实现类似微信首页的弹性滑动和惯性滑动效果,支持水平和垂直方向上的滚动,如下图所示:

vertical over-scroll
horizontal over-scroll

Behavior

CoordinatorLayout主要是通过Behavior来协调子view,这里涉及到的Behavior的关键方法如下:

方法 描述
boolean onStartNestedScroll(CoordinatorLayout parent, View child, View directTargetChild, View target, int nestedScrollAxes, int type) 根据返回值判断是否要处理target发生的滑动,一般用于判断是否要处理某个方向上的滑动.
例如return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;表示处理垂直方向方向上的滑动.接下来的滑动事件将回调给下面的方法处理.
void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed, int type) target即将发生滑动时调用,在这里可以做拦截处理.可以修改参数consumed表示消耗(拦截)了多少像素。例如target控件本身想要垂直方向上滑动100px,而我们需要拦截掉80px,则要设置 consumed[1] = 80,(consumed[0]consumed[1] 分别对应x轴和y轴)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值