丈夫欲遂平生志,一载寒窗一举汤。这篇文章主要讲述使用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系统上写C语言程序--开机启动该程序不进入安卓系统
- Android动画之萌萌哒蜡烛吹蜡烛动画
- Android自定义View实战之仿百度加载动画,一种优雅的Loading方式
- android自动化测试--appium运行的坑问题及解决方法
- Android自定义ViewGroup——带悬停标题的ExpandableListView
- Android适配难题全面总结
- Android 6.0 权限请求
- Android逆向工程
- Android客户端性能优化(魅族资深工程师毫无保留奉献)