您的位置:首页 > 移动开发 > Android开发

【用户界面:android-Ultra-Pull-To-Refresh】之二:android-Ultra-Pull-To-Refresh框架分析

2015-07-24 16:39 447 查看
作者:郭孝星

微博:郭孝星的新浪微博

邮箱:allenwells@163.com

博客:http://blog.csdn.net/allenwells

Github:https://github.com/AllenWells

【用户界面:android-Ultra-Pull-To-Refresh】章节列表

【用户界面:android-Ultra-Pull-To-Refresh】之一:android-Ultra-Pull-To-Refresh开篇

【用户界面:android-Ultra-Pull-To-Refresh】之二:android-Ultra-Pull-To-Refresh框架分析

android-Ultra-Pull-To-Refresh工程里有两个模块:

ptr-demo:功能演示模块

ptr-lib:功能实现模块

一 包结构分析

我们先来看一下ptr-lib的包结构,如下图所示:



从上图可以看出android-Ultra-Pull-To-Refresh的总体设计还是比较简单清晰的,下面我们来分别介绍每个包以及每个类的功能。

1.1 in.srain.cube.views.ptr

1.1.1 PtrHandler

下拉刷新的功能接口,包含刷新功能的回调方法以及判断是否可以下拉的方法,用户实现此接口来进行数据刷新工作。

1.1.2 PtrUIHandler

代表下拉刷新的UI接口,包含准备下拉、下拉中、下拉完成、重置以及下拉过程中的位置变化等回调方法。通常情况下,Header需要实现此接口,来处理下拉刷新过程中头部UI的变化。

1.1.3 PtrFrameLayout

PtrFrameLayout继承自ViewGroup,它包含两个View:

头部Header:实现PtrUIHandler

内容Content:可以作为任意的View

和所有自定义空间一样,PtrFrameLayout通过重写onFinishInflate()、onMeasure()和onLayout()来确定控件的大小和位置,通过重写dispatchTouchEvent()来确定控件的下拉行为。

1.1.4 PtrClassicDefaultHeader

PtrClassicDefaultHeader是抽象类,实现了 PtrHandler.java 接口,给出了 checkCanDoRefresh 的默认实现,给出了常见 View 是否可以下拉的判断方法。

1.1.5 PtrClassicFrameLayout

PtrClassicFrameLayout继承于PtrFrameLayout.java,经典下拉刷新实现类。

添加了 PtrClassicDefaultHeader 作为头部,用户使用时只需要设置 Content 即可。

1.1.6 PtrUIHandlerHook

PtrUIHandlerHook是钩子任务类,实现了Runnable接口,可以理解为在原来的操作之间,插入了一段任务去执行。

1.2 in.srain.cube.views.ptr.header

1.2.1 MaterialHeader

Material Design风格的头部实现。

1.2.2 StoreHouseHeader

StoreHouse风格的头部实现。

1.3 in.srain.cube.views.ptr.indicator

指示器

1.4 in.srain.cube.views.ptr.util

1.4.1 PtrCLog

打印工具类。

1.4.2 PtrLocalDisplay

显示相关工具类,用于获取用户设备屏幕宽度(像素,DP),高度(像素,DP)以及屏幕密度。同时提供了 dp和px的转化方法。

二 事件拦截流程分析

PtrFrameLayout事件拦截图流程图如下所示:

PtrFrameLayout事件拦截图流程图Visio源文件下载



2.1 ACTION_UP/ACTION_CANCEL

触发ACTION_UP/ACTION_CANCEL的时候执行的是onRelease()方法。

功能上:通过执行 tryToPerformRefresh()方法,如果向下拉动的位移已经超过了触发下拉刷新的偏移量mOffsetToRefresh,并且当前状态是PTR_STATUS_PREPARE,执行刷新功能回调。

行为上:如果没有达到触发刷新的偏移量,或者当前状态为PTR_STATUS_COMPLETE,或者刷新过程中不保持头部位置,则执行向上的位置回复动作。

2.2 ACTION_MOVE

触发ACTION_MOVE的时候会判断是否可以纵向 move。

ACTION_MOVE的方向向下:如果mPtrHandler不为空,并且mPtrHandler.checkCanDoRefresh()返回值为true,则可以移动,Header和Content向下移动,否则,事件交由父类处理。

ACTION_MOVE的方向向上:如果当前位置大于起始位置,则可以移动,Header和Content向上移动,否则,事件交由父类处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: