在下拉刷新系列一中,有列出幾種主流下拉刷新框架,今天主要來研究一下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則是在刷新的時候進度條會將佈局內容擠下來