在下拉刷新系列一中,有列出几种主流下拉刷新框架,今天主要来研究一下android-Ultra-Pull-To-Refresh
1. 基本用法
- 导库
dependencies {
......
//
api 'in.srain.cube:ultra-ptr:1.0.11'
}
- 布局ptr_act.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<in.srain.cube.views.ptr.PtrFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:ptr_resistance="1.7"
app:ptr_ratio_of_header_height_to_refresh="1.2"
app:ptr_duration_to_close="200"
app:ptr_duration_to_close_header="300"
app:ptr_keep_header_when_refresh="true"
app:ptr_pull_to_fresh="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#33ff0000">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center_vertical"
android:text="hello world"/>
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
</RelativeLayout>
- PtrAct.java
public class PtrAct extends Activity {
private PtrFrameLayout ptrFrameLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ptr_act);
ptrFrameLayout = findViewById(R.id.ptr_layout);
// PtrClassicDefaultHeader header = new PtrClassicDefaultHeader(this);
MaterialHeader header = new MaterialHeader(this);
ptrFrameLayout.setHeaderView(header);
ptrFrameLayout.addPtrUIHandler(header);
ptrFrameLayout.setLoadingMinTime(100);
ptrFrameLayout.setDurationToCloseHeader(100);
ptrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
// 检查是否可以刷新,这里使用默认的PtrHandler进行判断
return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
// 在刷新前需要准备什么工作
});
ptrFrameLayout.setPinContent(false);
// // the following are default settings
// ptrFrameLayout.setResistance(1.7f); // 设置下拉的阻尼系数,值越大感觉越难下拉
// ptrFrameLayout.setRatioOfHeaderHeightToRefresh(1.2f); // 设置超过头部的多少时,释放可以执行刷新操作
ptrFrameLayout.setDurationToClose(200); // 设置下拉回弹的时间
// ptrFrameLayout.setDurationToCloseHeader(1000); // 设置刷新完成,头部回弹时间,注意和前一个进行区别
// // default is false
ptrFrameLayout.setPullToRefresh(true);
// // default is true
// ptrFrameLayout.setKeepHeaderWhenRefresh(true);
}
}
2. 原理分析
android-Ultra-Pull-To-Refresh (简称 UltraPTR )是一个强大的 Andriod 下拉刷新框架
- 整个项目围绕核心类
PtrFrameLayout
,继承自ViewGroup,PtrFrameLayout代表了一个下拉刷新的自定义控件。有且只能有两个子View,头部Header
和内容Content
。和所有的自定义控件一样,PtrFrameLayout通过重写onFinishInflate、onMeasure、onLayout来确定控件的大小和位置,通过重写dispatchTouchEvent来确定控件的下拉行为。 - 通常情况下,Header会实现PtrUIHandler接口。简洁完善的Header抽象,方便进行扩展,构建满足需求的Header
- Content可以为任意的View
UltraPTR首先抽象出两个接口,功能接口
和UI接口
PtrHandler
代表下拉刷新的功能接口,包含刷新功能回调方法以及判断是否可以下拉的方法,用户实现此接口来进行数据刷新工作PtrUIHandler
代表下拉刷新的UI接口,包含准备下拉、下拉中、下拉完成、下拉重置以及下拉过程中的位置变化等回调方法。通常情况下,Header需要实现此接口,来处理下拉刷新过程中头部UI的变化
配置参数
- 阻尼系数:Resistance
// 默认: 1.7f,越大,感觉下拉时越吃力。
- 触发刷新时移动的位置比例:RatioOfHeaderHeightToRefresh
// 默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。
- 回弹延时:DurationToClose
// 默认 200ms,回弹到刷新高度所用时间
- 头部回弹时间:DurationToCloseHeader
// 默认1000ms
- 刷新是保持头部:KeepHeaderWhenRefresh
// 默认值 true.
- 下拉刷新 / 释放刷新:PullToRefresh
// 默认为释放刷新,默认false
- 头部风格
mPtrFrameLayout.setPinContent(true);
这里可以根据个人喜好设置true或者false,true则在刷新的时候,将布局里的内容固定不动,false则是在刷新的时候进度条会将布局内容挤下来