前面介绍了OverScroll的使用,没看过文章的同学可以先了解下《类似微信首页弹性滚动和惯性滚动效果的实现——OverScroll》
接下来介绍OverScroll的实现原理。
CoordinatorLayout
CoordinatorLayout
是在Support 包中功能强大的布局容器,它本质是一个 FrameLayout,然而它允许开发者通过自定义Behavior
协调各个子view,实现各种复杂酷炫的UI交互效果。
使用CoordinatorLayout
需要在 build.gradle 加入:
implementation 'com.android.support:design:26.1.0'
网上很多关于CoordinatorLayout
的入门文章,这里笔者不再赘述,所谓实践大于理论,本文讲述如何利用CoordinatorLayout+Behavior实现弹性滑动和惯性滑动,从侧面去理解它的使用原理.
本文实现类似微信首页的弹性滑动和惯性滑动效果,支持水平和垂直方向上的滚动,如下图所示:
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轴) |