【用户界面: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工程里有两个模块:
ptr-demo:功能演示模块
ptr-lib:功能实现模块
从上图可以看出android-Ultra-Pull-To-Refresh的总体设计还是比较简单清晰的,下面我们来分别介绍每个包以及每个类的功能。
头部Header:实现PtrUIHandler
内容Content:可以作为任意的View
和所有自定义空间一样,PtrFrameLayout通过重写onFinishInflate()、onMeasure()和onLayout()来确定控件的大小和位置,通过重写dispatchTouchEvent()来确定控件的下拉行为。
添加了 PtrClassicDefaultHeader 作为头部,用户使用时只需要设置 Content 即可。
PtrFrameLayout事件拦截图流程图Visio源文件下载
功能上:通过执行 tryToPerformRefresh()方法,如果向下拉动的位移已经超过了触发下拉刷新的偏移量mOffsetToRefresh,并且当前状态是PTR_STATUS_PREPARE,执行刷新功能回调。
行为上:如果没有达到触发刷新的偏移量,或者当前状态为PTR_STATUS_COMPLETE,或者刷新过程中不保持头部位置,则执行向上的位置回复动作。
ACTION_MOVE的方向向下:如果mPtrHandler不为空,并且mPtrHandler.checkCanDoRefresh()返回值为true,则可以移动,Header和Content向下移动,否则,事件交由父类处理。
ACTION_MOVE的方向向上:如果当前位置大于起始位置,则可以移动,Header和Content向上移动,否则,事件交由父类处理。
微博:郭孝星的新浪微博
邮箱: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向上移动,否则,事件交由父类处理。
相关文章推荐
- Espresso——Android测试工具Espresso简介
- android布局-GridLayout
- Android 无障碍服务一 让应用具有辅助性服务
- 自己写一个快速开发android模板
- Android笔记之四种方式实现计时器
- Android学习笔记【一】Android学习感言(包含学习见解、学习方法)
- 在Android Studio 中加入jar 和.so 文件
- 译文:Android中糟糕的AsyncTask
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
- Android实现ListView下拉刷新和上拉加载更多的思路
- 如何快速从android开发转向ios开发--oc语法篇
- Android ViewPager
- Android Studio 快捷键
- 通过Handler与线程嵌套TimerTask实现循环交替任务 分类: Android 2015-07-24 16:14 162人阅读 评论(0) 收藏
- adnroid sdk 更新代理设置
- Android Java中调用js代码,js中调用Java代码
- Android属性动画完全解析(上),初识属性动画的基本用法
- Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解
- Android开发实例透明效果设置方法
- IOException Unable to resolve host "api.linkface.cn": No address associated with hostname