代码上,它对应gui2::effect::trefresh类。
下拉刷新只涉及到一个track控件。
两类状态
trefresh在实现时引入了两类状态:app状态,track状态
app状态
对应trefresh中的refresh_变量。
基于刷新这行为,trefresh把它分为三个阶段:不刷新(norefresh),刷新中(refreshing)和已刷新(refreshed)。举个例子,手头有个蓝牙设备,app要从设备读数据。为避免误操作,一定要让手指在track控件向下拖动一段距离才开始读操作,在拖这距离的过程合称不刷新。app向蓝牙设备发请求读命令,蓝牙设备向app返回数据,这过程称为刷新。track控件回弹到初始位置称为已刷新。
track状态
trefresh中的track_status_变量。
基于track控件,trefresh把它分为三个阶段:常态(track_normal)、拖动(track_drag)和弹回(track_springback)。控件平时处于常态,手指按在track控件后处于拖动,一旦松开,track控件就进入弹回,弹回结束回到常态。
在生命期内,这两个状态在相互交织上没有清晰界线。举个例子,app状态处于刷新中时,track控件可能处于拖动也可能处于弹回。
不刷新(norefresh) | 刷新中(refreshing) | 刷新结束(refreshed) | |
对应track状态 | track_normal,后段时间须是track_drag | 一开始是track_drag,如果刷新没结束就松开,会进入track_springback | 如果刷新没结束就松开,一开始是track_drag,松开后进入track_springback |
app行为 | 它很大目的是为了避免误操作,app基于不要做 | 1)在这之前调用set_refreshing_anim,以决定刷新中要播放的动画。2)执行刷新操作 | 在这之前调用set_refreshed_text,以决定刷新结束要显示的文字 |
界面表现 | 不断拉伸image_指示的图像 | 播放anim_type_类型的动画 | 显示refreshed_text_指示的文字 |
关于界面表现的几点说明
- track正处于弹回状态,此时再次执行拖动,不会改变app状态,即当前是refreshed的话那拖动时还是refreshed。
app如何使用刷新特效
- 定义一个trefresh的类对象,像“trerfersh refresh_”。
- refresh_.set_widget(widget)。参数widget是指向track控件的指针。此个控件须要使能定时功能,定时间隔建议用100。
- refresh_.set_did_refreshing(boost::bind(&thome::did_refreshing, this))。挂接刷新函数。进入刷新状态后该函数将被调用。
- refresh_.set_did_can_drag(boost::bind(&thome::track_can_drag, this))。挂接判断当前是否可以拖动的函数。按下手指,刷新特效会调用这函数,用于判断当前是否能拖动。如果能拖动,该函数返回true,否则false。
- refresh_.set_refreshing_anim(anim2::MASCOT)。设置刷新时要播放动画类型。
- 在thome::callback_control_drag_detect调用refresh_.callback_control_drag_detect。你也可以直接把trefresh::callback_control_drag_detect作为track控件的处理函数。
- 在thome::callback_time调用“set_yoffset = drag_refresh_.draw(set_yoffset)”,要注意返回的set_offset可能不是输入值,它指示了实际“应该”使用的set_offset。
- 刷新完成,调用“refresh_.set_refreshed()”,在之前可调用“refresh_.set_refreshed_text(str)”来自定义要示的字符串。