1. 程式人生 > >Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

com 過程 kcon ava false design cube can out

一.gitHub地址及介紹

https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh

android-Ultra-Pull-To-Refresh (簡稱 UltraPTR )是一個強大的 Andriod 下拉刷新框架。 
1.繼承自ViewGroup,Content可以包含任何View; 
2.簡潔完善的Header抽象,方便進行擴展,構建滿足需求的Header;

對比於Android-PullToRefresh 來說,UltraPTR沒有實現上拉加載,作者認為上拉加載於下拉刷新不是同一個層次的功能,上拉加載應該交由Content自己去實現;Googgle官方的SwipeRefreshLayout也是這樣認為的,對比SwipeRefreshLayout,UltraPTR更加靈活,更容易擴展。

UltraPTR首先抽象出兩個接口,功能接口和UI接口 
PtrHandler代表下拉刷新的功能接口,包含刷新功能回調方法以及判斷是否可以下拉的方法,用戶實現此接口來進行數據刷新工作。 
PtrUIHandler代表下拉刷新的UI接口,包含準備下拉、下拉中、下拉完成、下拉重置以及下拉過程中的位置變化等回調方法。通常情況下,Header需要實現此接口,來處理下拉刷新過程中頭部UI的變化。

整個項目圍繞核心類PtrFrameLayout。 
PtrFrameLayout代表了一個下拉刷新的自定義控件。 
PtrFrameLayout繼承自ViewGroup,有且只能有兩個子View,頭部Header和內容Content。通常情況下,Header會實現PtrUIHandler接口,Content可以為任意的View。 
和所有的自定義控件一樣,PtrFrameLayout通過重寫onFinishInflate、onMeasure、onLayout來確定控件的大小和位置,通過重寫dispatchTouchEvent來確定控件的下拉行為。

  

二.6個配置參數

1.阻尼系數:Resistance
//默認: 1.7f,越大,感覺下拉時越吃力。

2.觸發刷新時移動的位置比例:RatioOfHeaderHeightToRefresh
//默認,1.2f,移動達到頭部高度1.2倍時可觸發刷新操作。

3.回彈延時:DurationToClose
//默認 200ms,回彈到刷新高度所用時間

4.頭部回彈時間:DurationToCloseHeader
//默認1000ms

5.刷新是保持頭部:KeepHeaderWhenRefresh
//默認值 true.

6.下拉刷新 / 釋放刷新:PullToRefresh

//默認為釋放刷新,默認false

xml文件中設置

<in.srain.cube.views.ptr.PtrFrameLayout
        android:id="@+id/ptrFragment"
        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="300"
        app:ptr_duration_to_close_header="300"
        app:ptr_keep_header_when_refresh="true"
        app:ptr_pull_to_fresh="false" >

        <LinearLayout
            android:id="@+id/store_house_ptr_image_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"
            android:padding="10dp">

            <ImageView
                android:id="@+id/img"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@mipmap/p5"
                />
        </LinearLayout>

    </in.srain.cube.views.ptr.PtrFrameLayout>

java代碼設置

        ptrFrame.setResistance(1.7f);
        ptrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
        ptrFrame.setDurationToClose(200);
        ptrFrame.setDurationToCloseHeader(1000);
        ptrFrame.setPullToRefresh(false);
        ptrFrame.setKeepHeaderWhenRefresh(true);

  

三、頭部風格

1.StoreHoseHeader

        storeHouseHeader=new StoreHouseHeader(this);
        storeHouseHeader.setBackgroundColor(Color.GRAY);
        storeHouseHeader.setTextColor(Color.RED);
        storeHouseHeader.setLineWidth(4);
        storeHouseHeader.initWithString("update");

  

2. MeterialHeader

 materialHeader = new MaterialHeader(this);
 materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});

  

3.PtrClassicDefaultHeader

 ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);

四、代碼實戰

 xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <in.srain.cube.views.ptr.PtrFrameLayout
        android:id="@+id/ptrFragment"
        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="300"
        app:ptr_duration_to_close_header="300"
        app:ptr_keep_header_when_refresh="true"
        app:ptr_pull_to_fresh="false" >

        <LinearLayout
            android:id="@+id/store_house_ptr_image_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"
            android:padding="10dp">

            <ImageView
                android:id="@+id/img"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@mipmap/p5"
                />
        </LinearLayout>

    </in.srain.cube.views.ptr.PtrFrameLayout>
</RelativeLayout>

  2.activity

public class TestActivity extends BaseActivity {

    private PtrFrameLayout ptrFrame;
    private ImageView img;
    private StoreHouseHeader storeHouseHeader;
    private MaterialHeader materialHeader;
    private PtrClassicDefaultHeader ptrClassicDefaultHeader;
    @Override
    protected void initView() {
        ptrFrame=findViewById(R.id.ptrFragment);
        img=findViewById(R.id.img);
        initPtrFm();
    }

    private void initPtrFm() {


        //1. 設置頭部
        initHeaders();
        //2.添加頭部
        ptrFrame.setHeaderView(materialHeader);
        //3.處理下拉刷新過程頭部UI的變化
        ptrFrame.addPtrUIHandler(materialHeader);
        //4.判斷是否可以下拉,數據刷新工作
        ptrFrame.setPtrHandler(new PtrHandler() {
            @Override
            public void onRefreshBegin(PtrFrameLayout frame) {
                frame.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        img.setImageResource(R.mipmap.p2);
                        ptrFrame.refreshComplete();
                    }
                }, 3000);
            }

            @Override
            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
                // 默認實現,根據實際情況做改動
                return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
            }
        });
    }

    private void initHeaders() {
        /**
         * //第一種頭部
         * StoreHouse風格的頭部實現
         */

        storeHouseHeader=new StoreHouseHeader(this);
        storeHouseHeader.setBackgroundColor(Color.GRAY);
        storeHouseHeader.setTextColor(Color.RED);
        storeHouseHeader.setLineWidth(4);
        storeHouseHeader.initWithString("update");
//        storeHouseHeader.initWithString("last  updatetime "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));


        //"last update @" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())

        /**
         * //第二種頭部
         * Material Design風格的頭部實現
         */
        materialHeader = new MaterialHeader(this);
        materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});//類似SwipeRefreshLayout


        /**
         * //第三種頭部
         * 經典 風格的頭部實現
         */
        ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);

    }

    @Override
    protected void initData() {

    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_test;
    }
}

  

Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用