使用Android SwipeRefreshLayout了解Android的嵌套滑动机制

丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述使用Android SwipeRefreshLayout了解Android的嵌套滑动机制相关的知识,希望能为你提供帮助。
SwipeRefreshLayout 是在android Support Library, revision 19.1.0添加到support v4库中的一个下拉刷新控件, 关于android的下拉刷新框架现在有好多, 曾经用过XListView, 现在工作中基本上无需用到下拉刷新的功能。废话不多说了, 这里来记录一下android自带的刷新控件SwipeRefreshLayout的使用, 借此顺便来熟悉一下android 在Lollipop版本推出的嵌套滑动机制( NestedScrolling) 。
首先来看SwipeRefreshLayout的使用, 使用很简单, 看一下布局文件

< ?xml version= " 1.0" encoding= " utf-8" ?> < android.support.v4.widget.SwipeRefreshLayout xmlns:android= " http://schemas.android.com/apk/res/android" xmlns:tools= " http://schemas.android.com/tools" android:id= " @ + id/swiperefresh" android:layout_width= " match_parent" android:layout_height= " match_parent" tools:context= " cj.com.recyclerviewdemo.RecyclerViewActivity" > < android.support.v7.widget.RecyclerView android:id= " @ + id/my_recycler_view" android:layout_width= " match_parent" android:layout_height= " wrap_content" /> < /android.support.v4.widget.SwipeRefreshLayout>

注意 SwipeRefreshLayout只能有一个直接的子View。这里用了RecyclerView, 因为前面刚刚讲过它。其实用啥子View都行, 只要你想通过竖直方向的滑动来刷新该View的显示内容。
关于SwipeRefreshLayout的一些API:

swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefresh); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); //swipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT); //默认设置进度圈的大小, 只有两个值: DEFAULT、LARGE //swipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.RED); //设置进度圈的背景色。 //swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimaryDark,R.color.colorPrimary,R.color.cardViewcolor); //设置进度动画的颜色 ..... swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @ Override public void onRefresh() { Log.d(" test" ," onRefresh" ); datas.add(0,new Contact(" xiaochen" ," 10086" )); handler.postDelayed(new Runnable() { @ Override public void run() { mAdapter.notifyDataSetChanged(); swipeRefreshLayout.setRefreshing(false); //设置刷新状态 false停止刷新 } },5000); } });


这里还是根据前文的demo来写的, 就刷新的时候, 在第一个位置添加一条数据, 咱看效果:
使用Android SwipeRefreshLayout了解Android的嵌套滑动机制

文章图片




SwipeRefreshLayout的使用没啥好讲的, 比较简单。
咱再一张效果图:
使用Android SwipeRefreshLayout了解Android的嵌套滑动机制

文章图片




注意上面我就传一个事件流, 即一个down事件, N个Move事件, 一个up事件, 然而我们可以发现Move事件的时候被SwipeRefreshLayout( 出现进度圈) 和RecyclerView( 向上滚动) 都处理了, 记得前面源码分析Android触摸事件处理机制一文我们分析过, android默认的触摸事件处理框架一个事件流只能被一个View处理, 当然通过一些手段还是可以做到一个事件流同时被几个View处理, 显然SwipeRefreshLayout和RecyclerView对触摸事件的处理流程做了一定处理。
所以咱来看看SwipeRefreshLayout和RecyclerView的 源码, 这里就不是去分析它们源码看它们怎么处理事件, 只是引出嵌套滑动的机制:

public class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent, NestedScrollingChild {




private final NestedScrollingParentHelper mNestedScrollingParentHelper; private final NestedScrollingChildHelper mNestedScrollingChildHelper;

SwipeRefreshLayout实现了NestedScrollingParent接口, 同时它也有一个成员变量是NestedScrollingParentHelper类型

public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild {


private NestedScrollingChildHelper mScrollingChildHelper;


RecyclerView实现了 NestedScrollingChild接口, 同时它也有一个成员变量是NestedScrollingChildHelper类型

发现了四个新的对象NestedScrollingParent, NestedScrollingChild, NestedScrollingChildHelper, NestedScrollingParentHelper。 前面说嵌套滑动机制主要由上面四个对象来实现的, SwipeRefreshLayout和RecyclerView之间就是利用嵌套滑动来实现下拉刷新的, 大家有兴趣可以阅读源码去分析。下面讲一下android这个嵌套滑动机制
Android 在发布 Lollipop版本之后, 为了更好的用户体验, Google为Android的滑动机制提供了NestedScrolling特性

【使用Android SwipeRefreshLayout了解Android的嵌套滑动机制】
理解嵌套滑动, 需要理解以下几个类(接口):

    推荐阅读