Android 自定义Behavior( 二 )


2、机制 2.1介绍
机制要求包含了一个实现了接口的滚动视图控件,比如v7包中的,设置属性的Child View会随着这个控件的滚动而发生变化,涉及到的方法有:
(View child, View , int )
(View , int dx, int dy, int[] )
(View , float , float )
(View , int , int , int , int )
(View , float , float ,)
(View )
下面我将简单描述下四个方法:
/***会遍历每一个 子View,询问它们是否对滚动列表的滚动事件感兴趣,若 Behavior.onStartNestedScroll 方法返回 true,*则表示感兴趣,那么滚动列表后续的滚动事件都会分发到该 子View的Behavior*/@Overridepublic boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int axes, int type) {return true;}/***处理 子View 的滚动事件*/@Overridepublic void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed, int type) {super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);}/*** 检测滚动距离的最终消费情况,可以继续处理 滚动事件*/@Overridepublic void onNestedScroll( CoordinatorLayout coordinatorLayout,View child,View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type);}/*** 检测到滚动事件的结束*/@Overridepublic void onStopNestedScroll( CoordinatorLayout coordinatorLayout,View child,View target, int type) {super.onStopNestedScroll(coordinatorLayout, child, target, type);}
2.2、举例说明机制

Android 自定义Behavior

文章插图
可以看到,当下拉列表时,红色布局就会消失,向上滑动时,红色布局就会出现 。
先创建一个,代码如下:
public class NestedBehavior extends CoordinatorLayout.Behavior {int offsetTotal = 0;public NestedBehavior(Context context, AttributeSet attrs) {super(context, attrs);}/***会遍历每一个 子View,询问它们是否对滚动列表的滚动事件感兴趣,若 Behavior.onStartNestedScroll 方法返回 true,*则表示感兴趣,那么滚动列表后续的滚动事件都会分发到该 子View的Behavior*/@Overridepublic boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int axes, int type) {return true;}/***处理 子View 的滚动事件*/@Overridepublic void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed, int type) {super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);offset(child, dy);}public void offset(View child, int dy) {// 上次保存的位置int old = offsetTotal;// 当前的位置int curr = offsetTotal - dy;// 保证子控件的位置一直在 0-控件高度之间curr = Math.max(curr, -child.getHeight());curr = Math.min(curr, 0);offsetTotal = curr;if (old == offsetTotal) {return;}// 原来的位置 - 当前的位置 = 要移动的位置int delta = old - offsetTotal;child.offsetTopAndBottom(delta);}}
.xml 代码:
【Android 自定义Behavior】.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent">.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent">