下拉刷新系列三:android-Ultra-Pull-To-Refresh 使用总结

赵明亮
2023-12-01

下拉刷新系列一中,有列出几种主流下拉刷新框架,今天主要来研究一下android-Ultra-Pull-To-Refresh

1. 基本用法
  1. 导库
dependencies {
    ......
    // 
    api 'in.srain.cube:ultra-ptr:1.0.11'
}
  1. 布局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>
  1. 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 下拉刷新框架

  1. 整个项目围绕核心类PtrFrameLayout,继承自ViewGroup,PtrFrameLayout代表了一个下拉刷新的自定义控件。有且只能有两个子View,头部Header内容Content。和所有的自定义控件一样,PtrFrameLayout通过重写onFinishInflate、onMeasure、onLayout来确定控件的大小和位置,通过重写dispatchTouchEvent来确定控件的下拉行为。
  2. 通常情况下,Header会实现PtrUIHandler接口。简洁完善的Header抽象,方便进行扩展,构建满足需求的Header
  3. Content可以为任意的View

UltraPTR首先抽象出两个接口,功能接口UI接口

  1. PtrHandler代表下拉刷新的功能接口,包含刷新功能回调方法以及判断是否可以下拉的方法,用户实现此接口来进行数据刷新工作
  2. PtrUIHandler代表下拉刷新的UI接口,包含准备下拉、下拉中、下拉完成、下拉重置以及下拉过程中的位置变化等回调方法。通常情况下,Header需要实现此接口,来处理下拉刷新过程中头部UI的变化

配置参数

  1. 阻尼系数:Resistance // 默认: 1.7f,越大,感觉下拉时越吃力。
  2. 触发刷新时移动的位置比例:RatioOfHeaderHeightToRefresh // 默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。
  3. 回弹延时:DurationToClose // 默认 200ms,回弹到刷新高度所用时间
  4. 头部回弹时间:DurationToCloseHeader // 默认1000ms
  5. 刷新是保持头部:KeepHeaderWhenRefresh // 默认值 true.
  6. 下拉刷新 / 释放刷新:PullToRefresh // 默认为释放刷新,默认false
  7. 头部风格
    mPtrFrameLayout.setPinContent(true);
    这里可以根据个人喜好设置true或者false,true则在刷新的时候,将布局里的内容固定不动,false则是在刷新的时候进度条会将布局内容挤下来
参考
  1. 下拉刷新PtrFrameLayout组件的使用
 类似资料: