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

Posted hehe26

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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来写的,就刷新的时候,在第一个位置添加一条数据,咱看效果:



SwipeRefreshLayout的使用没啥好讲的,比较简单。

咱再一张效果图:



注意上面我就传一个事件流,即一个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特性