核心技術點
- 觸摸事件分發:重寫
onInterceptTouchEvent 與 onTouchEvent,識別下拉手勢(ACTION_DOWN/MOVE/UP)。
- 狀態機管理:
PULL_DOWN → RELEASE_TO_REFRESH → REFRESHING → REFRESH_COMPLETE。
- Header View 動畫:根據下拉距離動態調整
paddingTop 或 translationY,配合旋轉箭頭、進度條動畫。
- 回調接口:定義
OnRefreshListener,刷新完成調用 onRefreshComplete() 恢復狀態。
- 嵌套滑動兼容:實現
NestedScrollingChild/Parent 接口,支持 RecyclerView、ViewPager 等嵌套場景。
關鍵代碼骨架
public class PullRefreshLayout extends ViewGroup implements NestedScrollingChild {
// 1. 狀態常量
// 2. HeaderView 容器
// 3. 觸摸攔截邏輯
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// 判斷是否為下拉手勢,且子視圖未滑動到頂部
}
// 4. 觸摸處理與動畫驅動
@Override
public boolean onTouchEvent(MotionEvent ev) {
// 計算位移,更新 Header 高度,觸發狀態變更
}
// 5. 刷新完成恢復
public void setRefreshing(boolean refreshing) { ... }
}
推薦開源庫(直接引用或參考源碼)
學習建議
- 先閱讀 Ultra-Pull-To-Refresh 核心類
PtrFrameLayout 理解經典邏輯。
- 再研究 SmartRefreshLayout 的
RefreshKernel、RefreshInternal 等模塊化設計。
- 嘗試手寫一個簡易版:只實現下拉觸發、Header 動畫、回調三大塊。