使用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
特性
以上是关于使用Android SwipeRefreshLayout了解Android的嵌套滑动机制的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )