前言:不知道还能这样坚持android多久啊,不管未来怎样,努力总还是会有收获的,h5之余还是要练练android的,不然就真忘记啦~~哈哈!!
今天要研究的是android v4自带的下拉刷新SwipeRefreshLayout,本来很久很久以前就想去研究一下它的,总是说自己没时间,其实时间挤挤还是有的,不废话了,先看一下最后用SwipeRefreshLayout实现的仿微信下拉刷新的效果图:
效果图看不出来那个美女拖动的效果,真实效果是有拖动的。
总体来说效果还是不错的,我们来看看源码然后一步一步实现其效果吧。
首先我们找到android.support.v4.widget.SwipeRefreshLayout这个类,用法呢很简单,就是在viewgroup外面套一层就可以了:
比如这样的:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/id_swipe"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
></LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>
然后你就可以控制刷新了,刷新的回调:
swipe= (SwipeRefreshLayout) findViewById(R.id.id_swipe);
swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipe.setRefreshing(false);
}
},3000);
}
});
重置刷新状态(控制刷新动作):
swipe.setRefreshing(false);
是不是soeasy呢?
其实现的原理是:
- 在onInterceptTouchEvent事件中做事件的拦截,当子控件到达顶部位置的时候并且滑动的距离大于最小滑动距离,则拦截子控件事件,自己处理。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
ensureTarget();
//当子控件滑动了,或者刷新指示器view正在回到初始状态的时候
//不拦截事件
if (!isEnabled() || mReturningToStart || canChildScrollUp()
|| mRefreshing || mNestedScrollInProgress) {
// Fail fast if we're not in a state where a swipe is possible
return false;
}
switch (action) {
....
case MotionEvent.ACTION_MOVE:
if (mActivePointerId == INV

本文介绍了Android自带的下拉刷新组件SwipeRefreshLayout的使用方法和工作原理,通过源码分析了其事件拦截和刷新机制。并展示了如何实现类似微信的下拉刷新效果,包括使用MaterialProgressDrawable创建进度条动画。
最低0.47元/天 解锁文章
4773

被折叠的 条评论
为什么被折叠?



