萬能下拉刷新效果實現

繼上次學習瞭如何實現QQ汽泡效果以後,此次來實現一個新的效果,幾乎是每一個項目不可獲缺的效果,那就是下拉刷新,因爲很是之熟悉了,就不過多說明了,另外這裏依然也涉及到對事件的處理,應該說是基於這個效果的實現進一步來鞏固對android的事件分發理解,說很少說進入正題。html

效果演示:android

先來看一下最終要實現的效果:git

固然市面上下拉刷新的效果千奇百怪,對於前陣子又融資了的美團在他們的美團app中就有一個下拉刷新效果,而下拉下來會有個綠色的小人蹦出來,我想用過美團的應該印象也很是深入,那若是學會了此次的這種比較傳統的效果,其美團的這種下拉效果實現起來也就不難了,並且此次要實現的是一個通用的下拉刷新,也就是應用到任何內容上都能實現下拉的效果,固然現在在github上也已經有很是成熟的三方開源方案了,可是要能本身從無到有的實現出來那也是挺美的一件事,因此下面一步步來剖析它。github

劃分區域:web

在正式實現以前先來對效果進行一下分析:網絡

因此第一步則須要劃分出這些區域,最後落實到代碼上來,首先新建一個類用來表示我們的下拉刷新控件,因爲這裏明顯是一個垂直結構的佈局,因此能夠基於LinearLayout進行擴展,而不用繼續最原生的View去寫了,這樣就不用來作測繪工做了,以下:app

/**
 * 下拉刷新控件
 * 初步劃分區域
 */
public class RefreshLayout extends LinearLayout {

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        //TODO
    }
}

而後將其聲明在XML佈局中:ide

而後初始化一個頭部視圖,這裏先直接上代碼,呆會再解釋:工具

/**
 * 下拉刷新控件
 * 初步劃分區域
 */
public class RefreshLayout extends LinearLayout {

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
 initWholeHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        LinearLayout wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081")); addView(wholeHeaderView); }
}

爲啥不添加一個實際的頭部,而是添加了一個空的視圖,這是由於爲了未來的擴展,由於這時一個通用的下拉刷新,將來的頭部的形式可能變幻無窮,好比將來的美團小人蹦出來的效果,其總體的下拉形式差很少,只是頭部的動畫會有變化,因此不一樣形式的頭部須要做爲上面整個頭部視圖的子視圖,這樣將來想要更換效果只要替換掉裏面的子視圖既可,因此這裏須要理解理解。好了,這時運行看下效果:佈局

呃,啥效果都木有了,本來不是有個TextView的文本內容麼?這是因爲我們木有對LinearLayout設置方向,因而乎加上它:

嗯,內容區域看到了,但頭部視圖還木有出來呀,這是因爲頭部視圖是wrap_content,而它並未添加任何子視圖,因此固然看不到了,這時爲了看效果先將頭部的高度寫死一個值:

再來運行:

好了,區域目前已經劃分好了,記得將這個寫死的代碼還原,接着下一步。

添加自定義頭部視圖並隱藏:

在第一步劃分區域對於頭部區域提到了子頭部視圖的概念,因此接下來在頭部區域中添加子視圖,而子視圖的效果就是帶箭頭和文字的,因此先準備具體頭部視圖的佈局文件:

view_refresh_header_normal.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginRight="10dip"
        android:layout_marginTop="15dp">

        <ImageView
            android:id="@+id/iv_normal_refresh_header_arrow"
            android:layout_width="28dp"
            android:layout_height="28dp"
            android:layout_gravity="center"
            android:src="@mipmap/refresh_head_arrow" />

        <ImageView
            android:id="@+id/iv_normal_refresh_header_loading"
            android:layout_width="34dp"
            android:layout_height="34dp"
            android:src="@drawable/refresh_loding"
            android:visibility="invisible" />
    </FrameLayout>

    <TextView
        android:id="@+id/tv_normal_refresh_header_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="15dp"
        android:layout_marginTop="15dp"
        android:text="下拉刷新"
        android:textColor="@android:color/white"
        android:textSize="14sp" />
</LinearLayout>

其中用到兩個資源圖:

①、箭頭:

②、Loading,這個Loading是由一個針動畫實現的,每幀圖片以下:

而動畫文件爲:

<?xml version="1.0" encoding="utf-8"?>
<!--animation-list:幀動畫
 每個item都是一幀
 android:oneshot="false" 表示動畫一直執行-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >

    <item
        android:drawable="@mipmap/refresh_loading01"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading02"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading03"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading04"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading05"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading06"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading07"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading08"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading09"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading10"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading11"
        android:duration="100"/>
    <item
        android:drawable="@mipmap/refresh_loading12"
        android:duration="100"/>

</animation-list>

這時將這個具體的頭部佈局添加到頭部視圖中:

/**
 * 下拉刷新控件
 * 添加自定義頭部視圖並隱藏
 */
public class RefreshLayout extends LinearLayout {

    /* 頭部根佈局 */
    private LinearLayout wholeHeaderView;

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setOrientation(LinearLayout.VERTICAL);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
        initWholeHeaderView();
        initSelfHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081"));
        addView(wholeHeaderView);
    }

    //初始化具體的頭部內容
    private void initSelfHeaderView() {
        View selfHeaderView = View.inflate(getContext(), R.layout.view_refresh_header_normal, null);
        selfHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); wholeHeaderView.addView(selfHeaderView); }
}

這時編譯運行:

嗯,完美,但接下來須要作一下頭部隱藏的效果,而這個隱藏並不是指直接將這個頭部視圖給設置成GONE,而是應該適應將來隨着手指的滑動而一點點改變頭部的高度,那採用什麼辦法可讓頭部隱藏掉呢? 這裏其實給具體的頭部View設置padding就能達到,下面來實驗下:

首先給paddingTop設置爲30看一下效果:

運行:

若是此時將paddingTop設置成負值呢?

編譯運行:

那隱藏頭部視圖的思路就有啦:讓這個paddingTop變成負具體頭部視圖的高度不就能夠了麼,那如何得到具體差部視圖的高度呢?根據經驗目前是在View的初始化階段:

此時並未對視圖進行測量,因此直接獲取selfHeaderView的測量高度確定是獲取不到滴,那要想得到測量高度則須要提早測量,那如何搞呢?

編譯運行:

這樣就爲以後的下拉刷新的效果作好了鋪墊。

頭部管理器的處理【重構】:

在繼續往下實現以前,對我們目前的代碼進行一下小重構,爲何呢?仍是爲了適應將來的具體頭部替換的需求,假如要換成美團的下拉刷新效果,頭部勢必要變,那看下若是要變,基於目前咱們的代碼這塊就得動:

很顯然不符合開閉原則,爲了應對將來會換具體頭部的需求,應該將SelfHeaderView的邏輯單獨出來,因而乎頭部管理器類的設計應運而生了,因此下面對目前的代碼進行調整一下:

/**
 * 爲了將來頭部內容能夠靈活進行切換,將其封裝於此
 */
public class SelfHeaderViewManager {

    private Context context;
    private View selfHeaderView;

    public SelfHeaderViewManager(Context context) {
        this.context = context;
    }

    public View getSelfHeaderView() {
        if (selfHeaderView == null) {
            selfHeaderView = View.inflate(context, R.layout.view_refresh_header_normal, null);
            selfHeaderView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        }
        return selfHeaderView;
    }
}

而後在RefreshLayout中實例化這個頭部管理器,而後將selfHeaderView的獲取經過管理器去拿,以下:

/**
 * 下拉刷新控件
 * 頭部管理器的處理
 */
public class RefreshLayout extends LinearLayout {

    /* 頭部根佈局 */
    private LinearLayout wholeHeaderView;

    /* 具體頭部管理器 */
    private SelfHeaderViewManager selfHeaderViewManager;

    /**
     * 設置自定義頭部管理器
     */
    public void setSelfHeaderViewManager(SelfHeaderViewManager selfHeaderViewManager) {
        this.selfHeaderViewManager = selfHeaderViewManager;
        initSelfHeaderView();
    }

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setOrientation(LinearLayout.VERTICAL);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
        initWholeHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081"));
        addView(wholeHeaderView);
    }

    //初始化具體的頭部內容
    private void initSelfHeaderView() {
        View selfHeaderView = selfHeaderViewManager.getSelfHeaderView();//此時處於視圖的加載階段,並未對視圖進行測量,想要獲取測量高度,須要提早測量
        selfHeaderView.measure(0, 0);
        int selfHeaderViewMeasuredHeight = selfHeaderView.getMeasuredHeight();
        //利用給頭部根佈局設置padding爲負達到隱藏它裏面子視圖的效果
        wholeHeaderView.setPadding(0, -selfHeaderViewMeasuredHeight, 0, 0);
        wholeHeaderView.addView(selfHeaderView);
    }
}

而最新的管理器的提供暴露給Activity去提供,以下:

有木有以爲這種寫法有點像RecyclerView在初始化時也須要傳入一個manager,以下:

嗯,有那麼一點意思,這樣就將具體頭部視圖的獲取從RefreshLayout中剝離開啦,另外還有一個小細節能夠再小調一下,就是對於頭部視圖測量高度的獲取,以下:

因此說幹就幹:

/**
 * 爲了將來頭部內容能夠靈活進行切換,將其封裝於此
 */
public class SelfHeaderViewManager {

    private Context context;
    private View selfHeaderView;

    public SelfHeaderViewManager(Context context) {
        this.context = context;
    }

    public View getSelfHeaderView() {
        if (selfHeaderView == null) {
            selfHeaderView = View.inflate(context, R.layout.view_refresh_header_normal, null);
            selfHeaderView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        }
        return selfHeaderView;
    }

    public int getSelfHeaderViewHeight() {
        //此時處於視圖的加載階段,並未對視圖進行測量,想要獲取測量高度,須要提早測量
        selfHeaderView.measure(0, 0);
        return selfHeaderView.getMeasuredHeight(); }

}

這時代碼可擴展性就比較好了~

定義邊界:

另外還須要作一個準備工做,就是須要定義出這兩個邊界值,如:

爲何要定義出這兩個邊界,由於在以後的邏輯判斷中會須要用到它,因此首先先定義最小的邊界變量:

/**
 * 下拉刷新控件
 * 定義邊界
 */
public class RefreshLayout extends LinearLayout {

    //views
    /* 頭部根佈局 */
    private LinearLayout wholeHeaderView;

    //variables
    /* 具體頭部管理器 */
    private SelfHeaderViewManager selfHeaderViewManager;
    /* 頭部視圖的最大上邊距,也就是默認需經過它來將頭部隱藏掉 */
    private int minWholeHeaderViewPaddingTop;

    /**
     * 設置自定義頭部管理器
     */
    public void setSelfHeaderViewManager(SelfHeaderViewManager selfHeaderViewManager) {
        this.selfHeaderViewManager = selfHeaderViewManager;
        initSelfHeaderView();
    }

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setOrientation(LinearLayout.VERTICAL);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
        initWholeHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081"));
        addView(wholeHeaderView);
    }

    //初始化具體的頭部內容
    private void initSelfHeaderView() {
        View selfHeaderView = selfHeaderViewManager.getSelfHeaderView();
        int selfHeaderViewMeasuredHeight = this.selfHeaderViewManager.getSelfHeaderViewHeight();
        minWholeHeaderViewPaddingTop = -selfHeaderViewMeasuredHeight;
        //利用給頭部根佈局設置padding爲負達到隱藏它裏面子視圖的效果
        wholeHeaderView.setPadding(0, minWholeHeaderViewPaddingTop, 0, 0);
        wholeHeaderView.addView(selfHeaderView);
    }
}

而後再再定義最大的頭部邊界,那最大邊界定義成多少呢?這裏用一個相對值,相對於具體頭部View的測量高度多於30%【可根據具體需求來定義】,以下:

/**
 * 下拉刷新控件
 * 定義邊界
 */
public class RefreshLayout extends LinearLayout {
    //constants
    /* 頭部視圖超出最大範圍的係數 */
    public static final float MAX_WHOLE_HEADER_VIEW_PADDING_TOP_RADIO = 0.3f;

    //views
    /* 頭部根佈局 */
    private LinearLayout wholeHeaderView;

    //variables
    /* 具體頭部管理器 */
    private SelfHeaderViewManager selfHeaderViewManager;
    /* 頭部視圖的最大上邊距,也就是默認需經過它來將頭部隱藏掉 */
    private int minWholeHeaderViewPaddingTop;
    /* 頭部視圖的最大上邊距=頭部視圖的高度*頭部視圖超出最大範圍的係數,也就是下拉頭部顯示高度的最大值 */
    private int maxWholeHeaderViewPaddingTop;

    /**
     * 設置自定義頭部管理器
     */
    public void setSelfHeaderViewManager(SelfHeaderViewManager selfHeaderViewManager) {
        this.selfHeaderViewManager = selfHeaderViewManager;
        initSelfHeaderView();
    }

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setOrientation(LinearLayout.VERTICAL);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
        initWholeHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081"));
        addView(wholeHeaderView);
    }

    //初始化具體的頭部內容
    private void initSelfHeaderView() {
        View selfHeaderView = selfHeaderViewManager.getSelfHeaderView();
        int selfHeaderViewMeasuredHeight = this.selfHeaderViewManager.getSelfHeaderViewHeight();
        minWholeHeaderViewPaddingTop = -selfHeaderViewMeasuredHeight;
        //最大邊界定義爲頭部高度的30%
        maxWholeHeaderViewPaddingTop = (int) (selfHeaderViewMeasuredHeight * MAX_WHOLE_HEADER_VIEW_PADDING_TOP_RADIO);
        //利用給頭部根佈局設置padding爲負達到隱藏它裏面子視圖的效果
        wholeHeaderView.setPadding(0, minWholeHeaderViewPaddingTop, 0, 0);
        wholeHeaderView.addView(selfHeaderView);
    }
}

寫完代碼了也得驗證一下是否達到預期,這裏對最大邊界進行測試一下,先臨時寫死代碼:

編譯運行:

好了,這個邊界條件的準備工做已經到位了,記得仍是將測試代碼還原。

將頭部拉出:

有了前面的準備工做以後,接下來要實現的效果就是增長滑動事件處理,也就是隨着手指向下滑動頭部視圖跟隨着慢慢移動,先來整理一下思路:

若是這時在滑到B點時,想讓頭部視圖也往下移動,那麼讓頭部視圖的paddingTop = paddingTop + (B.y - A.y),其效果以下:

因此能夠按着這個思路來編寫邏輯代碼,固然首先得要處理觸摸事件,以下:

假如內容是一個ListView,那是全部的事件都交由我們的RefreshLayout處理麼?不必定,看這麼一個狀況:

很明顯,在加載過程當中,事件是能夠被列表處理的,因此這裏先用默認的方式返回,具體啥時候返回true,啥時候返回false是須要根據業務邏輯來的:

對於DOWN事件,很顯示是須要由RefreshLayout處理,因此這裏能夠返回true,而後能夠獲取當前的y值:

/**
 * 下拉刷新控件
 * 將頭部拉出
 */
public class RefreshLayout extends LinearLayout {
    //constants
    /* 頭部視圖超出最大範圍的係數 */
    public static final float MAX_WHOLE_HEADER_VIEW_PADDING_TOP_RADIO = 0.3f;

    //views
    /* 頭部根佈局 */
    private LinearLayout wholeHeaderView;

    //variables
    /* 具體頭部管理器 */
    private SelfHeaderViewManager selfHeaderViewManager;
    /* 頭部視圖的最大上邊距,也就是默認需經過它來將頭部隱藏掉 */
    private int minWholeHeaderViewPaddingTop;
    /* 頭部視圖的最大上邊距=頭部視圖的高度*頭部視圖超出最大範圍的係數,也就是下拉頭部顯示高度的最大值 */
    private int maxWholeHeaderViewPaddingTop;
    private int downY;

    /**
     * 設置自定義頭部管理器
     */
    public void setSelfHeaderViewManager(SelfHeaderViewManager selfHeaderViewManager) {
        this.selfHeaderViewManager = selfHeaderViewManager;
        initSelfHeaderView();
    }

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setOrientation(LinearLayout.VERTICAL);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
        initWholeHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081"));
        addView(wholeHeaderView);
    }

    //初始化具體的頭部內容
    private void initSelfHeaderView() {
        View selfHeaderView = selfHeaderViewManager.getSelfHeaderView();
        int selfHeaderViewMeasuredHeight = this.selfHeaderViewManager.getSelfHeaderViewHeight();
        minWholeHeaderViewPaddingTop = -selfHeaderViewMeasuredHeight;
        //最大邊界定義爲頭部高度的30%
        maxWholeHeaderViewPaddingTop = (int) (selfHeaderViewMeasuredHeight * MAX_WHOLE_HEADER_VIEW_PADDING_TOP_RADIO);
        //利用給頭部根佈局設置padding爲負達到隱藏它裏面子視圖的效果
        wholeHeaderView.setPadding(0, minWholeHeaderViewPaddingTop, 0, 0);
        wholeHeaderView.addView(selfHeaderView);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downY = (int) event.getY();
                return true;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return super.onTouchEvent(event);//注意:因爲未來會套在ListView上面,因此這裏不能一股腦的將它返回true
    }
}

接着處理MOVE事件,目前也是能夠返回true,也獲取當前的y,並算出距離DOWN時y之間的差值,不過以後會對邏輯進行修改:

編譯運行:

呃,沒有作最大邊界判斷,目前頭部是無限能夠往下擴大的,因此這裏須要作一下邊界判斷,以下:

再次編譯運行:

嗯~~完美~~不過還差一個小細節,現實的下拉刷新控件在下拉時會有一個彈簧效果,也就是越往下越難拉出,相似於阻尼效果,如今是均勻拉出的,目前的paddingTop是線性變化的,能夠看下paddingTop的變化值:

其輸出以下:

12-11 10:40:27.291 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-62
12-11 10:40:27.307 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-61
12-11 10:40:27.323 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-57
12-11 10:40:27.339 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:40:27.359 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-56
12-11 10:40:27.371 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:40:27.391 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:40:27.407 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 10:40:27.423 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 10:40:27.443 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 10:40:27.507 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 10:40:27.523 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 10:40:27.543 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 10:40:27.559 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-51
12-11 10:40:27.575 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 10:40:27.599 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-47
12-11 10:40:27.623 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-45
12-11 10:40:27.643 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:40:27.655 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 10:40:27.675 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-38
12-11 10:40:27.691 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 10:40:27.707 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 10:40:27.723 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-35
12-11 10:40:27.743 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 10:40:27.759 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 10:40:27.775 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 10:40:27.791 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:40:27.823 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 10:40:27.839 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 10:40:27.859 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 10:40:27.875 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 10:40:27.891 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:40:27.907 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 10:40:27.923 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:-7
12-11 10:40:27.959 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 10:40:27.975 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:2
12-11 10:40:27.991 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:3
12-11 10:40:28.007 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:4
12-11 10:40:28.023 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:6
12-11 10:40:28.039 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:7
12-11 10:40:28.059 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:9
12-11 10:40:28.075 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:10
12-11 10:40:28.091 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:12
12-11 10:40:28.107 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:12
12-11 10:40:28.127 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:15
12-11 10:40:28.147 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:15
12-11 10:40:28.163 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:16
12-11 10:40:28.175 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:17
12-11 10:40:28.211 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:20
12-11 10:40:28.227 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:20
12-11 10:40:28.243 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:22
12-11 10:40:28.255 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:23
12-11 10:40:28.275 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:26
12-11 10:40:28.291 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:40:28.307 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:32
12-11 10:40:28.323 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:33
12-11 10:40:28.343 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:35
12-11 10:40:28.359 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:36
12-11 10:40:28.375 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:38
12-11 10:40:28.391 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:40
12-11 10:40:28.407 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:41
12-11 10:40:28.423 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:42
12-11 10:40:28.439 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:44
12-11 10:40:28.459 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:44
12-11 10:40:28.475 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:45
12-11 10:40:28.491 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:46
12-11 10:40:28.507 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:48
12-11 10:40:28.523 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:49
12-11 10:40:28.543 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:51
12-11 10:40:28.559 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:51
12-11 10:40:28.575 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:52
12-11 10:40:28.591 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:54
12-11 10:40:28.607 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:55
12-11 10:40:28.623 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:58
12-11 10:40:28.639 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:58
12-11 10:40:28.655 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:59
12-11 10:40:28.675 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:61
12-11 10:40:28.691 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:62
12-11 10:40:28.707 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:64
12-11 10:40:28.727 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:65
12-11 10:40:28.743 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:67
12-11 10:40:28.759 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:68
12-11 10:40:28.775 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:70
12-11 10:40:28.791 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:71
12-11 10:40:28.807 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:71
12-11 10:40:28.823 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:73
12-11 10:40:28.839 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:74
12-11 10:40:28.859 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:75
12-11 10:40:28.875 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:75
12-11 10:40:28.907 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:75
12-11 10:40:29.007 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:77
12-11 10:40:29.043 6796-6796/com.pulltorefresh.test E/cexo: paddingTop:77

而解決思路就是不讓它線性變化,怎麼作能夠不讓它線性變化呢?讓dy除以一個係數既可,以下:

這時再看:

能夠看到越往下則滑動距離越大,其看下paddingTop的變化:

12-11 10:44:27.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-62
12-11 10:44:27.624 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-62
12-11 10:44:27.640 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-61
12-11 10:44:27.656 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-61
12-11 10:44:27.676 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-60
12-11 10:44:27.692 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-60
12-11 10:44:27.708 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-59
12-11 10:44:27.740 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-59
12-11 10:44:27.756 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-59
12-11 10:44:27.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-59
12-11 10:44:27.808 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-57
12-11 10:44:27.824 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-58
12-11 10:44:27.840 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-57
12-11 10:44:27.856 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-57
12-11 10:44:27.876 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-57
12-11 10:44:27.892 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-56
12-11 10:44:27.908 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-56
12-11 10:44:27.924 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:44:27.944 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:44:27.956 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:44:27.976 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 10:44:28.008 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-53
12-11 10:44:28.024 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 10:44:28.040 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 10:44:28.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-53
12-11 10:44:28.092 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-53
12-11 10:44:28.108 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-51
12-11 10:44:28.124 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 10:44:28.140 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 10:44:28.156 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-51
12-11 10:44:28.176 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-51
12-11 10:44:28.208 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 10:44:28.224 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 10:44:28.244 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 10:44:28.276 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 10:44:28.292 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 10:44:28.308 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 10:44:28.324 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 10:44:28.360 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-48
12-11 10:44:28.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-48
12-11 10:44:28.392 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-48
12-11 10:44:28.428 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-47
12-11 10:44:28.440 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-47
12-11 10:44:28.460 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 10:44:28.492 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 10:44:28.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 10:44:28.524 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 10:44:28.556 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 10:44:28.576 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 10:44:28.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-44
12-11 10:44:28.640 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-45
12-11 10:44:28.692 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-45
12-11 10:44:28.724 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-44
12-11 10:44:28.740 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-44
12-11 10:44:28.772 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-44
12-11 10:44:28.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-43
12-11 10:44:28.824 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-43
12-11 10:44:28.840 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:44:28.860 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:44:28.892 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:44:28.908 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:44:28.956 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:44:28.992 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 10:44:29.040 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 10:44:29.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-41
12-11 10:44:29.108 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-41
12-11 10:44:29.124 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 10:44:29.172 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 10:44:29.208 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 10:44:29.292 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 10:44:29.340 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-39
12-11 10:44:29.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-39
12-11 10:44:29.440 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-39
12-11 10:44:29.456 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-38
12-11 10:44:29.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-39
12-11 10:44:29.544 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-39
12-11 10:44:29.556 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 10:44:29.576 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 10:44:29.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 10:44:29.624 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 10:44:29.640 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 10:44:29.656 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 10:44:29.692 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 10:44:29.708 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 10:44:29.724 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 10:44:29.740 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-35
12-11 10:44:29.756 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-35
12-11 10:44:29.776 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-35
12-11 10:44:29.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 10:44:29.808 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 10:44:29.824 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 10:44:29.840 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-33
12-11 10:44:29.856 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 10:44:29.892 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 10:44:29.924 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 10:44:29.992 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-33
12-11 10:44:30.040 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-33
12-11 10:44:30.092 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 10:44:30.172 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 10:44:30.208 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 10:44:30.224 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-31
12-11 10:44:30.256 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-31
12-11 10:44:30.292 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-31
12-11 10:44:30.308 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 10:44:30.324 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 10:44:30.360 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 10:44:30.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 10:44:30.392 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 10:44:30.428 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 10:44:30.440 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 10:44:30.460 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 10:44:30.476 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 10:44:30.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-28
12-11 10:44:30.524 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 10:44:30.540 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 10:44:30.556 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 10:44:30.576 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 10:44:30.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:44:30.660 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:44:30.756 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:44:31.024 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:44:31.040 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:44:31.056 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 10:44:31.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-25
12-11 10:44:31.092 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-25
12-11 10:44:31.108 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-25
12-11 10:44:31.140 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-24
12-11 10:44:31.156 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-23
12-11 10:44:31.172 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-22
12-11 10:44:31.192 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-22
12-11 10:44:31.208 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 10:44:31.240 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 10:44:31.256 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 10:44:31.276 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 10:44:31.292 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 10:44:31.324 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 10:44:31.392 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 10:44:31.692 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 10:44:31.708 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 10:44:31.740 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 10:44:31.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 10:44:31.824 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 10:44:31.876 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 10:44:31.908 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 10:44:31.940 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 10:44:31.956 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 10:44:31.976 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 10:44:32.008 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 10:44:32.044 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 10:44:32.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 10:44:32.092 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 10:44:32.124 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 10:44:32.160 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:44:32.172 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:44:32.224 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:44:32.272 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:44:32.292 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:44:32.340 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 10:44:32.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 10:44:32.408 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 10:44:32.424 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 10:44:32.456 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 10:44:32.476 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 10:44:32.492 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-10
12-11 10:44:32.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 10:44:32.524 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 10:44:32.540 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 10:44:32.576 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-10
12-11 10:44:32.592 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-10
12-11 10:44:32.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-9
12-11 10:44:32.640 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-10
12-11 10:44:32.676 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-10
12-11 10:44:32.708 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-8
12-11 10:44:32.740 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-9
12-11 10:44:32.760 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-9
12-11 10:44:32.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-8
12-11 10:44:32.808 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-8
12-11 10:44:32.840 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-8
12-11 10:44:32.856 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-6
12-11 10:44:32.892 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-7
12-11 10:44:32.924 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-7
12-11 10:44:32.976 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-6
12-11 10:44:33.008 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-6
12-11 10:44:33.024 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-6
12-11 10:44:33.056 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 10:44:33.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 10:44:33.108 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 10:44:33.124 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 10:44:33.140 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 10:44:33.156 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-4
12-11 10:44:33.176 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-4
12-11 10:44:33.192 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-3
12-11 10:44:33.208 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-3
12-11 10:44:33.224 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-2
12-11 10:44:33.240 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-2
12-11 10:44:33.256 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-2
12-11 10:44:33.292 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 10:44:33.308 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 10:44:33.324 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 10:44:33.340 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 10:44:33.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 10:44:33.392 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 10:44:33.424 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 10:44:33.460 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 10:44:33.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 10:44:33.540 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 10:44:33.556 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:1
12-11 10:44:33.576 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 10:44:33.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:1
12-11 10:44:33.640 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:2
12-11 10:44:33.660 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:2
12-11 10:44:33.692 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:3
12-11 10:44:33.724 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:3
12-11 10:44:33.756 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:4
12-11 10:44:33.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:3
12-11 10:44:33.808 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:3
12-11 10:44:33.840 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:4
12-11 10:44:33.856 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:4
12-11 10:44:33.908 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:4
12-11 10:44:33.940 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:5
12-11 10:44:33.976 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:5
12-11 10:44:34.024 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:5
12-11 10:44:34.060 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:6
12-11 10:44:34.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:6
12-11 10:44:34.092 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:6
12-11 10:44:34.124 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:7
12-11 10:44:34.140 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:7
12-11 10:44:34.160 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:7
12-11 10:44:34.176 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:8
12-11 10:44:34.212 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:7
12-11 10:44:34.224 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:7
12-11 10:44:34.240 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:8
12-11 10:44:34.264 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:8
12-11 10:44:34.280 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:9
12-11 10:44:34.308 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:9
12-11 10:44:34.332 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:10
12-11 10:44:34.360 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:11
12-11 10:44:34.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:11
12-11 10:44:34.392 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:12
12-11 10:44:34.412 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:12
12-11 10:44:34.428 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:12
12-11 10:44:34.440 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:13
12-11 10:44:34.476 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:12
12-11 10:44:34.492 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:13
12-11 10:44:34.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:13
12-11 10:44:34.524 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:14
12-11 10:44:34.544 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:14
12-11 10:44:34.556 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:14
12-11 10:44:34.572 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:14
12-11 10:44:34.592 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:14
12-11 10:44:34.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:14
12-11 10:44:34.624 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:16
12-11 10:44:34.640 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:16
12-11 10:44:34.660 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:17
12-11 10:44:34.672 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:16
12-11 10:44:34.692 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:16
12-11 10:44:34.724 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:17
12-11 10:44:34.748 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:17
12-11 10:44:34.756 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:18
12-11 10:44:34.776 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:18
12-11 10:44:34.792 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:18
12-11 10:44:34.808 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:19
12-11 10:44:34.824 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:19
12-11 10:44:34.840 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:19
12-11 10:44:34.876 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:19
12-11 10:44:34.892 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:21
12-11 10:44:34.908 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:21
12-11 10:44:34.924 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:21
12-11 10:44:34.940 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:21
12-11 10:44:34.956 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:21
12-11 10:44:34.976 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:22
12-11 10:44:34.992 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:22
12-11 10:44:35.024 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:22
12-11 10:44:35.040 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:23
12-11 10:44:35.056 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:23
12-11 10:44:35.076 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:23
12-11 10:44:35.108 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:24
12-11 10:44:35.124 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:23
12-11 10:44:35.156 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:23
12-11 10:44:35.176 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:24
12-11 10:44:35.208 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:24
12-11 10:44:35.224 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:24
12-11 10:44:35.244 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:24
12-11 10:44:35.276 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:25
12-11 10:44:35.308 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:25
12-11 10:44:35.344 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:25
12-11 10:44:35.356 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:27
12-11 10:44:35.376 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:26
12-11 10:44:35.392 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:26
12-11 10:44:35.408 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:26
12-11 10:44:35.424 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:27
12-11 10:44:35.456 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:27
12-11 10:44:35.476 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:44:35.492 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:44:35.508 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:44:35.524 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:44:35.540 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:44:35.560 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:28
12-11 10:44:35.608 6919-6919/com.pulltorefresh.test E/cexo: paddingTop:29

能夠看到日誌中有不少相同的數字,也就最直觀的效果就是拉了幾回纔會動一次,越拉越難拉,固然對於這個阻尼效果的係數能夠定義成常量,便於之後進行調節,以下:

定義狀態提升效率:

接下來來看一下"下拉刷新"和"釋放刷新"文本狀態變化的處理,這兩個狀態的觸發條件:當頭部未徹底顯示則顯示"下拉刷新",而若是拉出的高度超出頭部測量高度時則顯示"翻譯刷新",具體這裏就不演示了,而頭部徹底顯示時,其paddingTop=0,能夠寫死值看一下:

編譯運行:

so,那在move處理這能夠打點日誌來看一下是否能夠動態去執行相應的狀態轉換邏輯,先確保條件木有問題,在寫代碼以前先將寫死的測試值還原:

編譯運行:

12-11 11:04:31.041 7194-7194/com.pulltorefresh.test E/cexo: dY:2
12-11 11:04:31.041 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-62
12-11 11:04:31.041 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.057 7194-7194/com.pulltorefresh.test E/cexo: dY:4
12-11 11:04:31.057 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-61
12-11 11:04:31.057 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.077 7194-7194/com.pulltorefresh.test E/cexo: dY:6
12-11 11:04:31.077 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-60
12-11 11:04:31.077 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.093 7194-7194/com.pulltorefresh.test E/cexo: dY:8
12-11 11:04:31.093 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-59
12-11 11:04:31.093 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.109 7194-7194/com.pulltorefresh.test E/cexo: dY:7
12-11 11:04:31.109 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-60
12-11 11:04:31.109 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.125 7194-7194/com.pulltorefresh.test E/cexo: dY:8
12-11 11:04:31.125 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-59
12-11 11:04:31.125 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.145 7194-7194/com.pulltorefresh.test E/cexo: dY:10
12-11 11:04:31.145 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-58
12-11 11:04:31.145 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.181 7194-7194/com.pulltorefresh.test E/cexo: dY:12
12-11 11:04:31.181 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-57
12-11 11:04:31.181 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.193 7194-7194/com.pulltorefresh.test E/cexo: dY:13
12-11 11:04:31.193 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-56
12-11 11:04:31.193 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.217 7194-7194/com.pulltorefresh.test E/cexo: dY:14
12-11 11:04:31.217 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-56
12-11 11:04:31.217 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.245 7194-7194/com.pulltorefresh.test E/cexo: dY:16
12-11 11:04:31.245 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-55
12-11 11:04:31.245 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.273 7194-7194/com.pulltorefresh.test E/cexo: dY:17
12-11 11:04:31.273 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 11:04:31.273 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.309 7194-7194/com.pulltorefresh.test E/cexo: dY:18
12-11 11:04:31.309 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-54
12-11 11:04:31.309 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.333 7194-7194/com.pulltorefresh.test E/cexo: dY:20
12-11 11:04:31.333 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 11:04:31.333 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.353 7194-7194/com.pulltorefresh.test E/cexo: dY:20
12-11 11:04:31.357 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 11:04:31.357 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.369 7194-7194/com.pulltorefresh.test E/cexo: dY:21
12-11 11:04:31.369 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 11:04:31.369 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.377 7194-7194/com.pulltorefresh.test E/cexo: dY:21
12-11 11:04:31.377 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 11:04:31.377 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.393 7194-7194/com.pulltorefresh.test E/cexo: dY:21
12-11 11:04:31.393 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-52
12-11 11:04:31.393 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.409 7194-7194/com.pulltorefresh.test E/cexo: dY:24
12-11 11:04:31.409 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 11:04:31.409 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.425 7194-7194/com.pulltorefresh.test E/cexo: dY:23
12-11 11:04:31.425 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-51
12-11 11:04:31.425 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.441 7194-7194/com.pulltorefresh.test E/cexo: dY:24
12-11 11:04:31.441 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 11:04:31.441 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.461 7194-7194/com.pulltorefresh.test E/cexo: dY:24
12-11 11:04:31.461 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 11:04:31.461 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.473 7194-7194/com.pulltorefresh.test E/cexo: dY:24
12-11 11:04:31.477 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-50
12-11 11:04:31.477 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.493 7194-7194/com.pulltorefresh.test E/cexo: dY:27
12-11 11:04:31.493 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 11:04:31.493 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.509 7194-7194/com.pulltorefresh.test E/cexo: dY:26
12-11 11:04:31.509 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 11:04:31.509 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.525 7194-7194/com.pulltorefresh.test E/cexo: dY:26
12-11 11:04:31.525 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 11:04:31.525 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.541 7194-7194/com.pulltorefresh.test E/cexo: dY:27
12-11 11:04:31.541 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 11:04:31.541 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.557 7194-7194/com.pulltorefresh.test E/cexo: dY:27
12-11 11:04:31.557 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-49
12-11 11:04:31.557 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.573 7194-7194/com.pulltorefresh.test E/cexo: dY:29
12-11 11:04:31.573 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-47
12-11 11:04:31.577 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.593 7194-7194/com.pulltorefresh.test E/cexo: dY:30
12-11 11:04:31.593 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-47
12-11 11:04:31.593 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.609 7194-7194/com.pulltorefresh.test E/cexo: dY:30
12-11 11:04:31.609 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-47
12-11 11:04:31.609 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.625 7194-7194/com.pulltorefresh.test E/cexo: dY:31
12-11 11:04:31.625 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 11:04:31.625 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.641 7194-7194/com.pulltorefresh.test E/cexo: dY:31
12-11 11:04:31.641 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-46
12-11 11:04:31.641 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.661 7194-7194/com.pulltorefresh.test E/cexo: dY:33
12-11 11:04:31.661 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-45
12-11 11:04:31.661 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.673 7194-7194/com.pulltorefresh.test E/cexo: dY:33
12-11 11:04:31.677 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-45
12-11 11:04:31.677 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.693 7194-7194/com.pulltorefresh.test E/cexo: dY:35
12-11 11:04:31.693 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-44
12-11 11:04:31.693 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.709 7194-7194/com.pulltorefresh.test E/cexo: dY:36
12-11 11:04:31.709 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-44
12-11 11:04:31.709 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.725 7194-7194/com.pulltorefresh.test E/cexo: dY:37
12-11 11:04:31.725 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-43
12-11 11:04:31.725 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.741 7194-7194/com.pulltorefresh.test E/cexo: dY:39
12-11 11:04:31.741 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-42
12-11 11:04:31.741 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.761 7194-7194/com.pulltorefresh.test E/cexo: dY:40
12-11 11:04:31.761 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-41
12-11 11:04:31.761 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.777 7194-7194/com.pulltorefresh.test E/cexo: dY:42
12-11 11:04:31.777 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 11:04:31.777 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.793 7194-7194/com.pulltorefresh.test E/cexo: dY:43
12-11 11:04:31.793 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 11:04:31.793 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.809 7194-7194/com.pulltorefresh.test E/cexo: dY:43
12-11 11:04:31.809 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-40
12-11 11:04:31.809 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.825 7194-7194/com.pulltorefresh.test E/cexo: dY:45
12-11 11:04:31.825 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-39
12-11 11:04:31.825 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.845 7194-7194/com.pulltorefresh.test E/cexo: dY:46
12-11 11:04:31.845 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-38
12-11 11:04:31.845 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.857 7194-7194/com.pulltorefresh.test E/cexo: dY:46
12-11 11:04:31.857 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-38
12-11 11:04:31.857 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.877 7194-7194/com.pulltorefresh.test E/cexo: dY:47
12-11 11:04:31.877 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 11:04:31.877 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.893 7194-7194/com.pulltorefresh.test E/cexo: dY:47
12-11 11:04:31.893 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-37
12-11 11:04:31.893 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.909 7194-7194/com.pulltorefresh.test E/cexo: dY:49
12-11 11:04:31.909 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 11:04:31.909 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.925 7194-7194/com.pulltorefresh.test E/cexo: dY:50
12-11 11:04:31.925 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-36
12-11 11:04:31.925 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.941 7194-7194/com.pulltorefresh.test E/cexo: dY:52
12-11 11:04:31.941 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-35
12-11 11:04:31.941 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.957 7194-7194/com.pulltorefresh.test E/cexo: dY:52
12-11 11:04:31.957 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-35
12-11 11:04:31.957 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.973 7194-7194/com.pulltorefresh.test E/cexo: dY:53
12-11 11:04:31.977 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 11:04:31.977 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:31.993 7194-7194/com.pulltorefresh.test E/cexo: dY:53
12-11 11:04:31.993 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-34
12-11 11:04:31.993 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.009 7194-7194/com.pulltorefresh.test E/cexo: dY:55
12-11 11:04:32.009 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-33
12-11 11:04:32.009 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.025 7194-7194/com.pulltorefresh.test E/cexo: dY:56
12-11 11:04:32.025 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 11:04:32.025 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.041 7194-7194/com.pulltorefresh.test E/cexo: dY:56
12-11 11:04:32.041 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-32
12-11 11:04:32.041 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.077 7194-7194/com.pulltorefresh.test E/cexo: dY:60
12-11 11:04:32.077 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 11:04:32.077 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.093 7194-7194/com.pulltorefresh.test E/cexo: dY:59
12-11 11:04:32.093 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-31
12-11 11:04:32.093 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.109 7194-7194/com.pulltorefresh.test E/cexo: dY:60
12-11 11:04:32.109 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-30
12-11 11:04:32.109 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.129 7194-7194/com.pulltorefresh.test E/cexo: dY:63
12-11 11:04:32.129 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 11:04:32.129 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.141 7194-7194/com.pulltorefresh.test E/cexo: dY:62
12-11 11:04:32.141 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 11:04:32.141 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.157 7194-7194/com.pulltorefresh.test E/cexo: dY:64
12-11 11:04:32.157 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-28
12-11 11:04:32.157 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.177 7194-7194/com.pulltorefresh.test E/cexo: dY:63
12-11 11:04:32.177 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-29
12-11 11:04:32.177 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.193 7194-7194/com.pulltorefresh.test E/cexo: dY:65
12-11 11:04:32.193 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 11:04:32.193 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.209 7194-7194/com.pulltorefresh.test E/cexo: dY:65
12-11 11:04:32.209 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 11:04:32.209 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.225 7194-7194/com.pulltorefresh.test E/cexo: dY:66
12-11 11:04:32.225 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 11:04:32.225 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.241 7194-7194/com.pulltorefresh.test E/cexo: dY:66
12-11 11:04:32.241 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-27
12-11 11:04:32.241 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.261 7194-7194/com.pulltorefresh.test E/cexo: dY:69
12-11 11:04:32.261 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-25
12-11 11:04:32.261 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.277 7194-7194/com.pulltorefresh.test E/cexo: dY:68
12-11 11:04:32.277 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-26
12-11 11:04:32.277 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.293 7194-7194/com.pulltorefresh.test E/cexo: dY:69
12-11 11:04:32.293 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-25
12-11 11:04:32.293 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.309 7194-7194/com.pulltorefresh.test E/cexo: dY:69
12-11 11:04:32.309 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-25
12-11 11:04:32.309 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.329 7194-7194/com.pulltorefresh.test E/cexo: dY:72
12-11 11:04:32.329 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-24
12-11 11:04:32.329 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.341 7194-7194/com.pulltorefresh.test E/cexo: dY:72
12-11 11:04:32.341 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-24
12-11 11:04:32.341 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.357 7194-7194/com.pulltorefresh.test E/cexo: dY:73
12-11 11:04:32.357 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-23
12-11 11:04:32.357 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.377 7194-7194/com.pulltorefresh.test E/cexo: dY:72
12-11 11:04:32.377 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-24
12-11 11:04:32.377 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.397 7194-7194/com.pulltorefresh.test E/cexo: dY:74
12-11 11:04:32.397 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-22
12-11 11:04:32.397 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.409 7194-7194/com.pulltorefresh.test E/cexo: dY:73
12-11 11:04:32.409 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-23
12-11 11:04:32.409 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.425 7194-7194/com.pulltorefresh.test E/cexo: dY:76
12-11 11:04:32.425 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 11:04:32.429 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.449 7194-7194/com.pulltorefresh.test E/cexo: dY:76
12-11 11:04:32.449 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 11:04:32.449 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.457 7194-7194/com.pulltorefresh.test E/cexo: dY:77
12-11 11:04:32.457 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 11:04:32.457 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.493 7194-7194/com.pulltorefresh.test E/cexo: dY:76
12-11 11:04:32.493 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 11:04:32.493 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.525 7194-7194/com.pulltorefresh.test E/cexo: dY:76
12-11 11:04:32.525 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-21
12-11 11:04:32.525 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.577 7194-7194/com.pulltorefresh.test E/cexo: dY:79
12-11 11:04:32.577 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 11:04:32.577 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.609 7194-7194/com.pulltorefresh.test E/cexo: dY:78
12-11 11:04:32.609 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 11:04:32.609 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.641 7194-7194/com.pulltorefresh.test E/cexo: dY:78
12-11 11:04:32.641 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 11:04:32.641 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.693 7194-7194/com.pulltorefresh.test E/cexo: dY:80
12-11 11:04:32.693 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 11:04:32.693 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.741 7194-7194/com.pulltorefresh.test E/cexo: dY:79
12-11 11:04:32.741 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 11:04:32.741 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.777 7194-7194/com.pulltorefresh.test E/cexo: dY:79
12-11 11:04:32.777 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-20
12-11 11:04:32.777 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.829 7194-7194/com.pulltorefresh.test E/cexo: dY:81
12-11 11:04:32.829 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 11:04:32.829 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.893 7194-7194/com.pulltorefresh.test E/cexo: dY:81
12-11 11:04:32.893 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 11:04:32.893 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:32.957 7194-7194/com.pulltorefresh.test E/cexo: dY:81
12-11 11:04:32.957 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-19
12-11 11:04:32.957 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.009 7194-7194/com.pulltorefresh.test E/cexo: dY:82
12-11 11:04:33.009 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-18
12-11 11:04:33.009 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.077 7194-7194/com.pulltorefresh.test E/cexo: dY:82
12-11 11:04:33.077 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-18
12-11 11:04:33.077 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.125 7194-7194/com.pulltorefresh.test E/cexo: dY:82
12-11 11:04:33.125 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-18
12-11 11:04:33.125 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.157 7194-7194/com.pulltorefresh.test E/cexo: dY:84
12-11 11:04:33.157 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 11:04:33.157 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.193 7194-7194/com.pulltorefresh.test E/cexo: dY:84
12-11 11:04:33.193 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 11:04:33.193 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.225 7194-7194/com.pulltorefresh.test E/cexo: dY:84
12-11 11:04:33.225 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-17
12-11 11:04:33.225 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.241 7194-7194/com.pulltorefresh.test E/cexo: dY:85
12-11 11:04:33.241 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 11:04:33.241 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.277 7194-7194/com.pulltorefresh.test E/cexo: dY:85
12-11 11:04:33.277 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 11:04:33.277 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.293 7194-7194/com.pulltorefresh.test E/cexo: dY:85
12-11 11:04:33.293 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-16
12-11 11:04:33.293 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.309 7194-7194/com.pulltorefresh.test E/cexo: dY:88
12-11 11:04:33.309 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 11:04:33.309 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.325 7194-7194/com.pulltorefresh.test E/cexo: dY:87
12-11 11:04:33.325 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 11:04:33.325 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.345 7194-7194/com.pulltorefresh.test E/cexo: dY:87
12-11 11:04:33.345 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 11:04:33.345 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.361 7194-7194/com.pulltorefresh.test E/cexo: dY:88
12-11 11:04:33.361 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 11:04:33.361 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.377 7194-7194/com.pulltorefresh.test E/cexo: dY:88
12-11 11:04:33.377 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 11:04:33.377 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.393 7194-7194/com.pulltorefresh.test E/cexo: dY:88
12-11 11:04:33.393 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-15
12-11 11:04:33.393 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.425 7194-7194/com.pulltorefresh.test E/cexo: dY:89
12-11 11:04:33.425 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 11:04:33.425 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.441 7194-7194/com.pulltorefresh.test E/cexo: dY:89
12-11 11:04:33.441 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 11:04:33.441 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.461 7194-7194/com.pulltorefresh.test E/cexo: dY:89
12-11 11:04:33.461 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-14
12-11 11:04:33.461 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.477 7194-7194/com.pulltorefresh.test E/cexo: dY:92
12-11 11:04:33.477 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 11:04:33.477 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.493 7194-7194/com.pulltorefresh.test E/cexo: dY:91
12-11 11:04:33.493 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-13
12-11 11:04:33.493 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.509 7194-7194/com.pulltorefresh.test E/cexo: dY:91
12-11 11:04:33.509 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-13
12-11 11:04:33.509 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.525 7194-7194/com.pulltorefresh.test E/cexo: dY:93
12-11 11:04:33.525 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 11:04:33.525 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.541 7194-7194/com.pulltorefresh.test E/cexo: dY:92
12-11 11:04:33.541 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 11:04:33.541 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.557 7194-7194/com.pulltorefresh.test E/cexo: dY:92
12-11 11:04:33.557 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-12
12-11 11:04:33.557 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.577 7194-7194/com.pulltorefresh.test E/cexo: dY:95
12-11 11:04:33.577 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 11:04:33.577 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.593 7194-7194/com.pulltorefresh.test E/cexo: dY:94
12-11 11:04:33.593 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 11:04:33.593 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.609 7194-7194/com.pulltorefresh.test E/cexo: dY:94
12-11 11:04:33.609 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 11:04:33.609 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.625 7194-7194/com.pulltorefresh.test E/cexo: dY:95
12-11 11:04:33.629 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 11:04:33.629 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.641 7194-7194/com.pulltorefresh.test E/cexo: dY:95
12-11 11:04:33.641 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 11:04:33.641 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.657 7194-7194/com.pulltorefresh.test E/cexo: dY:95
12-11 11:04:33.657 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-11
12-11 11:04:33.657 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.677 7194-7194/com.pulltorefresh.test E/cexo: dY:98
12-11 11:04:33.677 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-9
12-11 11:04:33.677 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.693 7194-7194/com.pulltorefresh.test E/cexo: dY:97
12-11 11:04:33.693 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-10
12-11 11:04:33.693 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.709 7194-7194/com.pulltorefresh.test E/cexo: dY:99
12-11 11:04:33.709 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-9
12-11 11:04:33.709 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.725 7194-7194/com.pulltorefresh.test E/cexo: dY:98
12-11 11:04:33.725 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-9
12-11 11:04:33.725 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.741 7194-7194/com.pulltorefresh.test E/cexo: dY:100
12-11 11:04:33.741 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-8
12-11 11:04:33.741 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.761 7194-7194/com.pulltorefresh.test E/cexo: dY:100
12-11 11:04:33.761 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-8
12-11 11:04:33.761 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.777 7194-7194/com.pulltorefresh.test E/cexo: dY:102
12-11 11:04:33.777 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-7
12-11 11:04:33.777 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.793 7194-7194/com.pulltorefresh.test E/cexo: dY:101
12-11 11:04:33.793 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-7
12-11 11:04:33.793 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.809 7194-7194/com.pulltorefresh.test E/cexo: dY:105
12-11 11:04:33.809 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 11:04:33.809 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.829 7194-7194/com.pulltorefresh.test E/cexo: dY:105
12-11 11:04:33.829 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-5
12-11 11:04:33.829 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.845 7194-7194/com.pulltorefresh.test E/cexo: dY:107
12-11 11:04:33.845 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-4
12-11 11:04:33.845 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.873 7194-7194/com.pulltorefresh.test E/cexo: dY:108
12-11 11:04:33.873 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-4
12-11 11:04:33.873 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.901 7194-7194/com.pulltorefresh.test E/cexo: dY:110
12-11 11:04:33.901 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-2
12-11 11:04:33.901 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.917 7194-7194/com.pulltorefresh.test E/cexo: dY:111
12-11 11:04:33.917 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-2
12-11 11:04:33.917 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.937 7194-7194/com.pulltorefresh.test E/cexo: dY:112
12-11 11:04:33.937 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 11:04:33.937 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.953 7194-7194/com.pulltorefresh.test E/cexo: dY:113
12-11 11:04:33.953 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:-1
12-11 11:04:33.953 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲下拉刷新
12-11 11:04:33.969 7194-7194/com.pulltorefresh.test E/cexo: dY:114
12-11 11:04:33.969 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 11:04:33.969 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:33.977 7194-7194/com.pulltorefresh.test E/cexo: dY:117
12-11 11:04:33.977 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:1
12-11 11:04:33.977 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:33.993 7194-7194/com.pulltorefresh.test E/cexo: dY:116
12-11 11:04:33.993 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 11:04:33.993 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.017 7194-7194/com.pulltorefresh.test E/cexo: dY:116
12-11 11:04:34.017 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:0
12-11 11:04:34.017 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.037 7194-7194/com.pulltorefresh.test E/cexo: dY:117
12-11 11:04:34.037 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:1
12-11 11:04:34.037 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.061 7194-7194/com.pulltorefresh.test E/cexo: dY:119
12-11 11:04:34.061 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:2
12-11 11:04:34.061 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.089 7194-7194/com.pulltorefresh.test E/cexo: dY:118
12-11 11:04:34.089 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:1
12-11 11:04:34.089 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.109 7194-7194/com.pulltorefresh.test E/cexo: dY:119
12-11 11:04:34.109 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:2
12-11 11:04:34.109 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.129 7194-7194/com.pulltorefresh.test E/cexo: dY:120
12-11 11:04:34.129 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:2
12-11 11:04:34.129 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.153 7194-7194/com.pulltorefresh.test E/cexo: dY:121
12-11 11:04:34.153 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:3
12-11 11:04:34.153 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新
12-11 11:04:34.177 7194-7194/com.pulltorefresh.test E/cexo: dY:123
12-11 11:04:34.177 7194-7194/com.pulltorefresh.test E/cexo: paddingTop:4
12-11 11:04:34.177 7194-7194/com.pulltorefresh.test E/cexo: 改變文字爲釋放刷新

嗯~~條件木問題,可是!!發現一個性能問題:

一樣的,釋放刷新也有一樣的問題:

目前是純日誌對於性能體現不是很明顯,但若是這裏面有大段的邏輯那就很是明顯了,因而乎如標題有說須要定義一些狀態來提升程序的效率,對於狀態用枚舉定義是最合適不過的啦,有幾種狀態呢?直接給出代碼,有註釋比較好理解:

因此這就須要定義一個字段用來記錄當前RefreshLayout的狀態:

而後在MOVE文字狀態改變那塊加入當前狀態的判斷,具體以下:

編譯運行:

這樣代碼效率也會較高~

文字和箭頭隨狀態改變:

接下來就真正處理上一步中的狀態變化,這裏將狀態變化的邏輯處理封裝到一個方法中集中管理,以下:

接着就是對不一樣的狀態進行界面上的邏輯處理了,想一下不一樣的頭部其處理邏輯是不同的,目前是隻須要改變文字和箭頭,那若是是美團的頭部呢其處理又不是同樣的,因此說對於這具體的狀態處理應該轉由我們的selfHeaderViewManager來處理,因而乎每一個狀態對應一個方法,以下:

/**
 * 爲了將來頭部內容能夠靈活進行切換,將其封裝於此
 * 作狀態刷新
 */
public class SelfHeaderViewManager {

    private Context context;
    private View selfHeaderView;

    public SelfHeaderViewManager(Context context) {
        this.context = context;
    }

    public View getSelfHeaderView() {
        if (selfHeaderView == null) {
            selfHeaderView = View.inflate(context, R.layout.view_refresh_header_normal, null);
            selfHeaderView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        }
        return selfHeaderView;
    }

    public int getSelfHeaderViewHeight() {
        //此時處於視圖的加載階段,並未對視圖進行測量,想要獲取測量高度,須要提早測量
        selfHeaderView.measure(0, 0);
        return selfHeaderView.getMeasuredHeight();
    }

    public void changeToIdle() {
        //TODO
    }

    public void changeToPullDown() {
        //TODO
    }

    public void changeToReleaseRefresh() {
        //TODO
    }

    public void changeToRefreshing() {
        //TODO
 }
}

而後這時先對頭部的文字提示作下狀態處理,以下:

public class SelfHeaderViewManager {

    private Context context;

    private View selfHeaderView;
    /* 提示文本 */
    private TextView tv_normal_refresh_header_status;

    public SelfHeaderViewManager(Context context) {
        this.context = context;
    }

    public View getSelfHeaderView() {
        if (selfHeaderView == null) {
            selfHeaderView = View.inflate(context, R.layout.view_refresh_header_normal, null);
            selfHeaderView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            tv_normal_refresh_header_status = selfHeaderView.findViewById(R.id.tv_normal_refresh_header_status);
        }
        return selfHeaderView;
    }

    public int getSelfHeaderViewHeight() {
        //此時處於視圖的加載階段,並未對視圖進行測量,想要獲取測量高度,須要提早測量
        selfHeaderView.measure(0, 0);
        return selfHeaderView.getMeasuredHeight();
    }

    public void changeToIdle() {
        //TODO
    }

    public void changeToPullDown() {
        tv_normal_refresh_header_status.setText("下拉刷新");
    }

    public void changeToReleaseRefresh() {
        tv_normal_refresh_header_status.setText("釋放刷新");
    }

    public void changeToRefreshing() {
        //TODO
    }
}

編譯運行:

接下來處理箭頭的動畫,在下拉刷新時箭頭是順時針旋轉爲向下方向,而到了釋放刷新時則箭頭是逆時針旋轉爲向上方向,因此說先實例化兩個動畫:

public class SelfHeaderViewManager {

    private Context context;
    /* 箭頭旋轉向上動畫 */
    private RotateAnimation upAnimation;
    /* 箭頭旋轉向下動畫 */
    private RotateAnimation downAnimation;

    private View selfHeaderView;
    /* 提示文本 */
    private TextView tv_normal_refresh_header_status;

    public SelfHeaderViewManager(Context context) {
        this.context = context;
        initAnimation();
    }

    private void initAnimation() {
        upAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        upAnimation.setDuration(100);
        //動畫執行完成後不會回到原點
        upAnimation.setFillAfter(true);

        downAnimation = new RotateAnimation(-180, 0, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        downAnimation.setDuration(100);
        //動畫執行完成後不會回到原點
        downAnimation.setFillAfter(true);
    }

    public View getSelfHeaderView() {
        if (selfHeaderView == null) {
            selfHeaderView = View.inflate(context, R.layout.view_refresh_header_normal, null);
            selfHeaderView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            tv_normal_refresh_header_status = selfHeaderView.findViewById(R.id.tv_normal_refresh_header_status);
        }
        return selfHeaderView;
    }

    public int getSelfHeaderViewHeight() {
        //此時處於視圖的加載階段,並未對視圖進行測量,想要獲取測量高度,須要提早測量
        selfHeaderView.measure(0, 0);
        return selfHeaderView.getMeasuredHeight();
    }

    public void changeToIdle() {
        //TODO
    }

    public void changeToPullDown() {
        tv_normal_refresh_header_status.setText("下拉刷新");
    }

    public void changeToReleaseRefresh() {
        tv_normal_refresh_header_status.setText("釋放刷新");
    }

    public void changeToRefreshing() {
        //TODO
    }
}

而後在指定狀態中去讓箭頭View執行對應的動畫:

編譯運行:

擡起手後隱藏頭部:

接下來處理UP事件了,首先處理什麼時候消費UP事件的問題,從效果中能夠看到只要是拉出頭部,UP事件就應該由當前RefreshLayout處理,而其它狀況是不須要處理UP事件的,因此相似MOVE事件,也將UP事件的邏輯封裝到一個方法中處理:

接下來具體處理UP,得分兩種狀況,一是下拉刷新狀態時UP應該是讓頭部縮回去,二是釋放刷新狀態時UP應該是進行刷新中的狀態,這裏先只處理第一種狀況,具體處理以下:

這時在UP隱藏頭部時應該從當前拉出的頭部位置執行一段動畫將它隱藏有一段時間,這時ValueAnimator就派上用場了,以前也已經用過了,具體寫法以下:

編譯看下效果:

擡起手後從釋放刷新進入刷新中狀態:

接着處理UP的另一種狀態-刷新中,邏輯也比較簡單,直接上代碼:

 接着得繼續完頭部beginRefreshing方法,首先應該是先將頭部從拉出的位置回到正常頭部的狀態,也就是回到頭部測量高度,這時跟上一步驟的動畫效果相似:

最後還須要根據當前刷新中的狀態對頭部視圖進行更新,更新爲:文字是"刷新中..."、Loading代替箭頭,因此這個處理固然是在SelfHeaderViewManager進行啦,以下:

/**
 * 爲了將來頭部內容能夠靈活進行切換,將其封裝於此
 * 擡起手後從釋放刷新進入刷新中狀態
 */
public class SelfHeaderViewManager {

    private Context context;
    /* 箭頭旋轉向上動畫 */
    private RotateAnimation upAnimation;
    /* 箭頭旋轉向下動畫 */
    private RotateAnimation downAnimation;
    /* Loading動畫 */
    private AnimationDrawable animationDrawable;

    private View selfHeaderView;
    /* 提示文本 */
    private TextView tv_normal_refresh_header_status;
    /* 箭頭 */
    private ImageView iv_normal_refresh_header_arrow;
    /* loadingView */
    private ImageView iv_normal_refresh_header_loading;

    public SelfHeaderViewManager(Context context) {
        this.context = context;
        initAnimation();
    }

    private void initAnimation() {
        upAnimation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        upAnimation.setDuration(100);
        //動畫執行完成後不會回到原點
        upAnimation.setFillAfter(true);

        downAnimation = new RotateAnimation(-180, 0, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        downAnimation.setDuration(100);
        //動畫執行完成後不會回到原點
        downAnimation.setFillAfter(true);
    }

    public View getSelfHeaderView() {
        if (selfHeaderView == null) {
            selfHeaderView = View.inflate(context, R.layout.view_refresh_header_normal, null);
            selfHeaderView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
            tv_normal_refresh_header_status = selfHeaderView.findViewById(R.id.tv_normal_refresh_header_status);
            iv_normal_refresh_header_arrow = selfHeaderView.findViewById(R.id.iv_normal_refresh_header_arrow);
            iv_normal_refresh_header_loading = selfHeaderView.findViewById(R.id.iv_normal_refresh_header_loading);
            animationDrawable = (AnimationDrawable) iv_normal_refresh_header_loading.getDrawable();
        }
        return selfHeaderView;
    }

    public int getSelfHeaderViewHeight() {
        //此時處於視圖的加載階段,並未對視圖進行測量,想要獲取測量高度,須要提早測量
        selfHeaderView.measure(0, 0);
        return selfHeaderView.getMeasuredHeight();
    }

    public void changeToIdle() {
        //TODO
    }

    public void changeToPullDown() {
        tv_normal_refresh_header_status.setText("下拉刷新");
        iv_normal_refresh_header_arrow.startAnimation(downAnimation);
    }

    public void changeToReleaseRefresh() {
        tv_normal_refresh_header_status.setText("釋放刷新");
        iv_normal_refresh_header_arrow.startAnimation(upAnimation);
    }

    public void changeToRefreshing() {
        tv_normal_refresh_header_status.setText("加載中..."); iv_normal_refresh_header_arrow.setVisibility(View.INVISIBLE); iv_normal_refresh_header_loading.setVisibility(View.VISIBLE); animationDrawable.start();
    }
}

編譯運行:

呃~~貌似看到一個bug,爲啥鬆手以後箭頭木有隱藏呢?這裏不賣關子了,是因爲箭頭view以前是執行過動畫,對於執行過動畫的View想要隱藏以前須要先將動畫清除,因此這個須要注意,解決以下:

再次編譯運行:

從刷新中還原到初始狀態:

最後再來處理刷新完以後的狀態,在完成最後一個狀態以前,先來解決一個bug,先演示下:

竟然在刷新中狀態中頭部還能夠隨手指滑動,正常在刷新狀態中是不容許再響應滑動事件啦,因此解決起來也so easy,加個條件判斷:

編譯運行:

接着來處理刷新結束以後的狀態,那問題來了,何時刷新結束呢?很顯然這應該是由調用方去肯定,好比請求網絡,而對於我們這個demo而言應該是由Activity來決定什麼時候刷新完,因此RefreshLayout應該往外甩刷新回調出來,而後Activity在刷新回調中進行具體刷新邏輯,因而乎:

/**
 * 下拉刷新控件
 * 從刷新中還原到初始狀態
 */
public class RefreshLayout extends LinearLayout {
    //constants
    /* 頭部視圖超出最大範圍的係數 */
    public static final float MAX_WHOLE_HEADER_VIEW_PADDING_TOP_RADIO = 0.3f;
    /* 阻尼效果的拉出係數 */
    public static final float DRAG_RADIO = 1.8f;

    /* 刷新狀態 */
    public enum RefreshStatus {
        IDLE/*靜止*/, PULL_DOWN/*下拉*/, RELEASE_REFRESH/*釋放刷新*/, REFRESHING/*刷新*/
    }

    //views
    /* 頭部根佈局 */
    private LinearLayout wholeHeaderView;

    //variables
    /* 具體頭部管理器 */
    private SelfHeaderViewManager selfHeaderViewManager;
    /* 頭部視圖的最大上邊距,也就是默認需經過它來將頭部隱藏掉 */
    private int minWholeHeaderViewPaddingTop;
    /* 頭部視圖的最大上邊距=頭部視圖的高度*頭部視圖超出最大範圍的係數,也就是下拉頭部顯示高度的最大值 */
    private int maxWholeHeaderViewPaddingTop;
    private int downY;
    private RefreshLayout.RefreshStatus currentStatus = RefreshLayout.RefreshStatus.IDLE;
    /* 刷新回調監聽 */
    private RefreshLayout.OnRefreshingListener onRefreshingListener;

    public void setOnRefreshingListener(RefreshLayout.OnRefreshingListener onRefreshingListener) {
        this.onRefreshingListener = onRefreshingListener;
    }
    
    /**
     * 設置自定義頭部管理器
     */
    public void setSelfHeaderViewManager(SelfHeaderViewManager selfHeaderViewManager) {
        this.selfHeaderViewManager = selfHeaderViewManager;
        initSelfHeaderView();
    }

    public RefreshLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setOrientation(LinearLayout.VERTICAL);
        init();
    }

    private void init() {
        //一、初始化頭部的視圖
        initWholeHeaderView();
    }

    private void initWholeHeaderView() {
        //動態添加一個頭部的根部局,以便將來能夠動態更換頭部:好比上下箭頭效果、美團效果等
        wholeHeaderView = new LinearLayout(getContext());
        wholeHeaderView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        wholeHeaderView.setBackgroundColor(Color.parseColor("#FF4081"));
        addView(wholeHeaderView);
    }

    //初始化具體的頭部內容
    private void initSelfHeaderView() {
        View selfHeaderView = selfHeaderViewManager.getSelfHeaderView();
        int selfHeaderViewMeasuredHeight = this.selfHeaderViewManager.getSelfHeaderViewHeight();
        minWholeHeaderViewPaddingTop = -selfHeaderViewMeasuredHeight;
        //最大邊界定義爲頭部高度的30%
        maxWholeHeaderViewPaddingTop = (int) (selfHeaderViewMeasuredHeight * MAX_WHOLE_HEADER_VIEW_PADDING_TOP_RADIO);
        //利用給頭部根佈局設置padding爲負達到隱藏它裏面子視圖的效果
        wholeHeaderView.setPadding(0, minWholeHeaderViewPaddingTop, 0, 0);
        wholeHeaderView.addView(selfHeaderView);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downY = (int) event.getY();
                return true;
            case MotionEvent.ACTION_MOVE:
                if (handleActionMove(event))
                    return true;
                break;
            case MotionEvent.ACTION_UP:
                if (handleActionUp(event))
                    return true;
                break;
        }
        return super.onTouchEvent(event);//注意:因爲未來會套在ListView上面,因此這裏不能一股腦的將它返回true
    }

    private boolean handleActionMove(MotionEvent event) {
        if (currentStatus == RefreshLayout.RefreshStatus.REFRESHING)//若是是刷新狀態了,則不容許移動了
            return false;
        int moveY = (int) event.getY();
        int dY = moveY - downY;
        Log.e("cexo", "dY:" + dY);
        //只有向下移動才能拉出頭部
        if (dY > 0) {
//            int paddingTop = minWholeHeaderViewPaddingTop + dY;
            //阻尼效果:就是相似彈簧的效果,隨距離愈來愈長,拉動愈來愈難,讓dy除以一個係數,不讓它是線性變化
            int paddingTop = (int) (minWholeHeaderViewPaddingTop + dY / DRAG_RADIO);
            Log.e("cexo", "paddingTop:" + paddingTop);
            if (paddingTop < 0 && currentStatus != RefreshLayout.RefreshStatus.PULL_DOWN) {
                currentStatus = RefreshLayout.RefreshStatus.PULL_DOWN;
                //改變文字爲下拉刷新
                handleRefreshStatusChanged();
            } else if (paddingTop >= 0 && currentStatus != RefreshLayout.RefreshStatus.RELEASE_REFRESH) {
                currentStatus = RefreshLayout.RefreshStatus.RELEASE_REFRESH;
                //改變文字爲釋放刷新,並箭頭進行旋轉
                handleRefreshStatusChanged();
            }
            //判斷若是paddingTop>maxWholeHeaderViewPaddingTop,就不能再滑動了
            paddingTop = Math.min(paddingTop, maxWholeHeaderViewPaddingTop);
            wholeHeaderView.setPadding(0, paddingTop, 0, 0);
            return true;
        }
        return false;
    }

    private boolean handleActionUp(MotionEvent event) {
        if (currentStatus == RefreshLayout.RefreshStatus.PULL_DOWN) {
            //若是是下拉刷新狀態則鬆開手時直接讓頭部隱藏
            hiddenRefreshView();
            currentStatus = RefreshLayout.RefreshStatus.IDLE;
            //若是換爲美團下拉刷新等,當頭部回到初始狀態時須要作一些還原操做
            handleRefreshStatusChanged();
        } else if (currentStatus == RefreshLayout.RefreshStatus.RELEASE_REFRESH) {
            beginRefreshing();
        }
        //只要將頭部拉出一點點UP事件就由當前控件處理
        return wholeHeaderView.getPaddingTop() > minWholeHeaderViewPaddingTop;
    }

    private void hiddenRefreshView() {
        ValueAnimator valueAnimator = ValueAnimator.ofInt(wholeHeaderView.getPaddingTop(), minWholeHeaderViewPaddingTop);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                //獲取值動畫在動畫變化過程當中的值
                int currentPaddingTop = (int) valueAnimator.getAnimatedValue();
                wholeHeaderView.setPadding(0, currentPaddingTop, 0, 0);
            }
        });
        valueAnimator.setDuration(300);
        valueAnimator.start();
    }

    /**
     * 開始刷新
     */
    private void beginRefreshing() {
        currentStatus = RefreshLayout.RefreshStatus.REFRESHING;
        changeHeaderViewPaddingTopToZero();
        handleRefreshStatusChanged();
        if (onRefreshingListener != null) onRefreshingListener.onRefresh();
    }

    /**
     * 將頭部的paddingTop改變爲0,也就是還原成頭部的高度
     */
    private void changeHeaderViewPaddingTopToZero() {
        ValueAnimator valueAnimator = ValueAnimator.ofInt(wholeHeaderView.getPaddingTop(), 0);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                //獲取值動畫在動畫變化過程當中的值
                int currentPaddingTop = (int) valueAnimator.getAnimatedValue();
                wholeHeaderView.setPadding(0, currentPaddingTop, 0, 0);
            }
        });
        valueAnimator.setDuration(300);
        valueAnimator.start();
    }

    /**
     * 根據當前的下拉狀態來作界面刷新,具體實現由manager處理
     */
    private void handleRefreshStatusChanged() {
        switch (currentStatus) {
            case IDLE:
                selfHeaderViewManager.changeToIdle();
                break;
            case PULL_DOWN:
                selfHeaderViewManager.changeToPullDown();
                break;
            case RELEASE_REFRESH:
                selfHeaderViewManager.changeToReleaseRefresh();
                break;
            case REFRESHING:
                selfHeaderViewManager.changeToRefreshing();
                break;
        }
    }

    public interface OnRefreshingListener {
        void onRefresh(); }
}

而後在Activity去註冊回調:

而後當執行完刷新邏輯以後,RefreshLayout還應該給外面暴露結束刷新的方法,因此增長結束方法以下:

這時在Activity簡單作個延時來模擬刷新邏輯,以下:

好了,看下最終效果:

加入RecyclerView以後的事件處理:

哎呀,終於到最後一步了,以前在重寫onTouchEvent()事件時就說當內容是列表界面時會有滑動衝突問題,而實際下拉刷新基本上都是基於列表,因此接下來就專項來處理它,因此內容先加入RecyclerView並整些列表數據讓它顯示出來,因爲以前在集成QQ汽泡時已經用到RecyclerView,因此這裏直接上代碼,很少解釋:

佈局中定義:

<?xml version="1.0" encoding="utf-8"?>
<com.pulltorefresh.test.RefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/lay_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.pulltorefresh.test.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/lay_rlv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</com.pulltorefresh.test.RefreshLayout>

填充數據:

//加入RecyclerView以後的事件處理
public class MainActivity extends AppCompatActivity implements RefreshLayout.OnRefreshingListener {

    private RefreshLayout lay_refresh_layout;
    private RecyclerView lay_rlv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lay_refresh_layout = (RefreshLayout) findViewById(R.id.lay_refresh_layout);
        lay_refresh_layout.setSelfHeaderViewManager(new SelfHeaderViewManager(this));
        lay_refresh_layout.setOnRefreshingListener(this);
        initRecyclerView();
    }

    @Override
    public void onRefresh() {
        //獲取網絡數據
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //當獲取完數據後通知RefreshLayout還原
                lay_refresh_layout.endRefreshing();
            }
        }, 2000);
    }

    private void initRecyclerView() {
        lay_rlv = (RecyclerView) findViewById(R.id.lay_rlv);
        lay_rlv.setLayoutManager(new LinearLayoutManager(this));
        List<String> datas = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            datas.add("條目" + i);
        }
        MainActivity.MyAdapter adapter = new MainActivity.MyAdapter(datas);
        lay_rlv.setAdapter(adapter);
    }


    private class MyAdapter extends RecyclerView.Adapter<MainActivity.MyAdapter.MyViewHolder> {
        private List<String> datas;

        public MyAdapter(List<String> datas) {
            this.datas = datas;
        }

        @Override
        public MainActivity.MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null);//TODO
            return new MainActivity.MyAdapter.MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(MainActivity.MyAdapter.MyViewHolder holder, int position) {
            holder.tv.setText(datas.get(position));
        }

        @Override
        public int getItemCount() {
            return datas.size();
        }

        class MyViewHolder extends RecyclerView.ViewHolder {
            private TextView tv;

            public MyViewHolder(View itemView) {
                super(itemView);
                tv = (TextView) itemView.findViewById(android.R.id.text1); } } }
}

運行:

嗯~列表是顯示出來了,可是竟然下拉拉不出頭部了,首先衝突就暴露出來了,也是接下來要來征服它滴。

這時要解釋目前只有RecyclerView處理事件,而我們的RefreshLayout卻沒能處理,這時就要加想一下我們上次分析的事件分發的原理啦【http://www.cnblogs.com/webor2006/p/7860381.html】,可見掌握事件分發的原理是何等重要,這時先來分角色,很顯示RefreshLayout能夠當作孔融爺爺,而RecyclerView能夠當作孔融爸爸,當這兩個的onTouchEvent()都返回true,也就是都想處理事件時,最終會交給孩子,如:

而此時若是父視圖【RefreshLayout】想處理事件,能夠重寫onInterceptTouchEvent返回true來強迫事件本身處理,如:

固然咱們得分條件來處理onInterceptTouchEvent(),不過這裏爲了讓我們的RefreshLayout能得到事件,先一股腦的重寫onInterceptTouchEvent()=true,看看效果:

很顯然事件全都由RefreshLayout處理啦,說明經過控制onInterceptTouchEvent()就能夠達到某種條件下讓RefreshLayout父視圖處理,某種條件交由RecyclerView子視圖處理,那問題來了,什麼條件下RefreshLayout()的onInterceptTouchEvent()返回true呢?很顯示粗略的觀察,只要是向下滑動時,這時應該返回true,那對應邏輯應該怎麼寫呢?其也就是判斷y滑動的距離是否大於x滑動的距離就能夠了,在寫代碼以前記得將這個強行測試返回true的代碼還原,以下:

接下來運行一下:

嗯,貌似是父子視圖均可以處理事件了,可是仍是存在bug的,首先先來看第一個bug:

滑動一點點,竟然頭部就出來一大塊,這明顯是不對的,那如何查找緣由呢?由於跟滑動用關,因此最好仍是經過打印日誌的方法來定位,因而乎在滑動處理方法中打以下日誌:

再次復現,並查看日誌:

繼續打日誌跟蹤downY=0的異常緣由:

再次復現,看日誌:

呃~~竟然沒有走RefreshLayout.onTouchEvent()的DOWN事件,那是爲啥呢?這時就得再次回憶我們的事件分發啦,從源碼來分析其緣由:

因爲在RefreshLayout中的onInterceptTouchEvent()在DOWN並未返回true,也就是爲false,以下:

因此這會將事件分發給它的子視圖去處理:

這時再來看它的事件處理過程:

這時事件再由裏往外傳遞,最終發現爺爺的down事件並未傳到它自身的onTouchEvent(),由於:

這就從源碼上來解釋了這個問題,那如何解決目前沒有走RefreshLayout的onTouchEvent()中的DOWN事件形成downY=0,其時在MOVE時發現downY=0時能夠作個補救措施,由於第一個MOVE跟DOWN的位置幾乎相鄰,因此修改代碼以下:

編譯運行:

好了,這個BUG修復了,再來演示另一個BUG,重頭開始演示哈:

也就是第一次DOWN木有問題能夠正常拉出頭部,可是若是第二次DOWN的位置在第一次DOWN位置上面就滑不出頭部了,這具體是啥緣由呢?看下剛纔的日誌輸出:

12-13 06:12:37.856 4328-4328/com.pulltorefresh.test E/cexo: dY:-160;moveY:201downY:361
12-13 06:13:03.188 4328-4328/com.pulltorefresh.test E/cexo: dY:28;moveY:389downY:361
12-13 06:13:03.188 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-48
12-13 06:13:03.204 4328-4328/com.pulltorefresh.test E/cexo: dY:29;moveY:390downY:361
12-13 06:13:03.204 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-47
12-13 06:13:03.224 4328-4328/com.pulltorefresh.test E/cexo: dY:30;moveY:391downY:361
12-13 06:13:03.224 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-47
12-13 06:13:03.236 4328-4328/com.pulltorefresh.test E/cexo: dY:34;moveY:395downY:361
12-13 06:13:03.236 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-45
12-13 06:13:03.252 4328-4328/com.pulltorefresh.test E/cexo: dY:36;moveY:397downY:361
12-13 06:13:03.252 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-44
12-13 06:13:03.272 4328-4328/com.pulltorefresh.test E/cexo: dY:39;moveY:400downY:361
12-13 06:13:03.272 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-42
12-13 06:13:03.288 4328-4328/com.pulltorefresh.test E/cexo: dY:41;moveY:402downY:361
12-13 06:13:03.288 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-41
12-13 06:13:03.308 4328-4328/com.pulltorefresh.test E/cexo: dY:43;moveY:404downY:361
12-13 06:13:03.308 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-40
12-13 06:13:03.324 4328-4328/com.pulltorefresh.test E/cexo: dY:46;moveY:407downY:361
12-13 06:13:03.324 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-38
12-13 06:13:03.340 4328-4328/com.pulltorefresh.test E/cexo: dY:48;moveY:409downY:361
12-13 06:13:03.340 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-37
12-13 06:13:03.356 4328-4328/com.pulltorefresh.test E/cexo: dY:51;moveY:412downY:361
12-13 06:13:03.356 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-35
12-13 06:13:03.372 4328-4328/com.pulltorefresh.test E/cexo: dY:52;moveY:413downY:361
12-13 06:13:03.372 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-35
12-13 06:13:03.396 4328-4328/com.pulltorefresh.test E/cexo: dY:53;moveY:414downY:361
12-13 06:13:03.396 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-34
12-13 06:13:03.432 4328-4328/com.pulltorefresh.test E/cexo: dY:56;moveY:417downY:361
12-13 06:13:03.432 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-32
12-13 06:13:03.456 4328-4328/com.pulltorefresh.test E/cexo: dY:56;moveY:417downY:361
12-13 06:13:03.456 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-32
12-13 06:13:03.468 4328-4328/com.pulltorefresh.test E/cexo: dY:58;moveY:419downY:361
12-13 06:13:03.468 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-31
12-13 06:13:03.484 4328-4328/com.pulltorefresh.test E/cexo: dY:59;moveY:420downY:361
12-13 06:13:03.484 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-31
12-13 06:13:03.496 4328-4328/com.pulltorefresh.test E/cexo: dY:61;moveY:422downY:361
12-13 06:13:03.496 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-30
12-13 06:13:03.504 4328-4328/com.pulltorefresh.test E/cexo: dY:62;moveY:423downY:361
12-13 06:13:03.504 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-29
12-13 06:13:03.532 4328-4328/com.pulltorefresh.test E/cexo: dY:62;moveY:423downY:361
12-13 06:13:03.532 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-29
12-13 06:13:03.536 4328-4328/com.pulltorefresh.test E/cexo: dY:63;moveY:424downY:361
12-13 06:13:03.536 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-29
12-13 06:13:03.552 4328-4328/com.pulltorefresh.test E/cexo: dY:65;moveY:426downY:361
12-13 06:13:03.552 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-27
12-13 06:13:03.568 4328-4328/com.pulltorefresh.test E/cexo: dY:65;moveY:426downY:361
12-13 06:13:03.568 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-27
12-13 06:13:03.588 4328-4328/com.pulltorefresh.test E/cexo: dY:66;moveY:427downY:361
12-13 06:13:03.588 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-27
12-13 06:13:03.604 4328-4328/com.pulltorefresh.test E/cexo: dY:66;moveY:427downY:361
12-13 06:13:03.604 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-27
12-13 06:13:03.624 4328-4328/com.pulltorefresh.test E/cexo: dY:68;moveY:429downY:361
12-13 06:13:03.624 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-26
12-13 06:13:03.640 4328-4328/com.pulltorefresh.test E/cexo: dY:69;moveY:430downY:361
12-13 06:13:03.640 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-25
12-13 06:13:03.656 4328-4328/com.pulltorefresh.test E/cexo: dY:71;moveY:432downY:361
12-13 06:13:03.656 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-24
12-13 06:13:03.672 4328-4328/com.pulltorefresh.test E/cexo: dY:71;moveY:432downY:361
12-13 06:13:03.672 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-24
12-13 06:13:03.688 4328-4328/com.pulltorefresh.test E/cexo: dY:72;moveY:433downY:361
12-13 06:13:03.688 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-24
12-13 06:13:03.720 4328-4328/com.pulltorefresh.test E/cexo: dY:74;moveY:435downY:361
12-13 06:13:03.720 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-22
12-13 06:13:03.740 4328-4328/com.pulltorefresh.test E/cexo: dY:75;moveY:436downY:361
12-13 06:13:03.740 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-22
12-13 06:13:03.756 4328-4328/com.pulltorefresh.test E/cexo: dY:75;moveY:436downY:361
12-13 06:13:03.756 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-22
12-13 06:13:03.772 4328-4328/com.pulltorefresh.test E/cexo: dY:76;moveY:437downY:361
12-13 06:13:03.772 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-21
12-13 06:13:03.788 4328-4328/com.pulltorefresh.test E/cexo: dY:78;moveY:439downY:361
12-13 06:13:03.788 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-20
12-13 06:13:03.808 4328-4328/com.pulltorefresh.test E/cexo: dY:78;moveY:439downY:361
12-13 06:13:03.808 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-20
12-13 06:13:03.820 4328-4328/com.pulltorefresh.test E/cexo: dY:79;moveY:440downY:361
12-13 06:13:03.820 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-20
12-13 06:13:03.840 4328-4328/com.pulltorefresh.test E/cexo: dY:81;moveY:442downY:361
12-13 06:13:03.840 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-19
12-13 06:13:03.856 4328-4328/com.pulltorefresh.test E/cexo: dY:84;moveY:445downY:361
12-13 06:13:03.856 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-17
12-13 06:13:03.868 4328-4328/com.pulltorefresh.test E/cexo: dY:85;moveY:446downY:361
12-13 06:13:03.868 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-16
12-13 06:13:03.892 4328-4328/com.pulltorefresh.test E/cexo: dY:88;moveY:449downY:361
12-13 06:13:03.892 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-15
12-13 06:13:03.904 4328-4328/com.pulltorefresh.test E/cexo: dY:91;moveY:452downY:361
12-13 06:13:03.904 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-13
12-13 06:13:03.924 4328-4328/com.pulltorefresh.test E/cexo: dY:94;moveY:455downY:361
12-13 06:13:03.924 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-11
12-13 06:13:03.940 4328-4328/com.pulltorefresh.test E/cexo: dY:97;moveY:458downY:361
12-13 06:13:03.940 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-10
12-13 06:13:03.956 4328-4328/com.pulltorefresh.test E/cexo: dY:99;moveY:460downY:361
12-13 06:13:03.956 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-9
12-13 06:13:03.972 4328-4328/com.pulltorefresh.test E/cexo: dY:103;moveY:464downY:361
12-13 06:13:03.972 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-6
12-13 06:13:03.984 4328-4328/com.pulltorefresh.test E/cexo: dY:105;moveY:466downY:361
12-13 06:13:03.984 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-5
12-13 06:13:04.004 4328-4328/com.pulltorefresh.test E/cexo: dY:108;moveY:469downY:361
12-13 06:13:04.004 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-4
12-13 06:13:04.024 4328-4328/com.pulltorefresh.test E/cexo: dY:109;moveY:470downY:361
12-13 06:13:04.024 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-3
12-13 06:13:04.040 4328-4328/com.pulltorefresh.test E/cexo: dY:112;moveY:473downY:361
12-13 06:13:04.040 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:-1
12-13 06:13:04.056 4328-4328/com.pulltorefresh.test E/cexo: dY:114;moveY:475downY:361
12-13 06:13:04.056 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:0
12-13 06:13:04.088 4328-4328/com.pulltorefresh.test E/cexo: dY:117;moveY:478downY:361
12-13 06:13:04.088 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:1
12-13 06:13:04.108 4328-4328/com.pulltorefresh.test E/cexo: dY:118;moveY:479downY:361
12-13 06:13:04.108 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:1
12-13 06:13:04.140 4328-4328/com.pulltorefresh.test E/cexo: dY:121;moveY:482downY:361
12-13 06:13:04.140 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:3
12-13 06:13:04.172 4328-4328/com.pulltorefresh.test E/cexo: dY:122;moveY:483downY:361
12-13 06:13:04.172 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:3
12-13 06:13:04.188 4328-4328/com.pulltorefresh.test E/cexo: dY:124;moveY:485downY:361
12-13 06:13:04.188 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:4
12-13 06:13:04.212 4328-4328/com.pulltorefresh.test E/cexo: dY:125;moveY:486downY:361
12-13 06:13:04.212 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:5
12-13 06:13:04.252 4328-4328/com.pulltorefresh.test E/cexo: dY:127;moveY:488downY:361
12-13 06:13:04.252 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:6
12-13 06:13:04.272 4328-4328/com.pulltorefresh.test E/cexo: dY:128;moveY:489downY:361
12-13 06:13:04.272 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:7
12-13 06:13:04.300 4328-4328/com.pulltorefresh.test E/cexo: dY:130;moveY:491downY:361
12-13 06:13:04.300 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:8
12-13 06:13:04.308 4328-4328/com.pulltorefresh.test E/cexo: dY:130;moveY:491downY:361
12-13 06:13:04.308 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:8
12-13 06:13:04.320 4328-4328/com.pulltorefresh.test E/cexo: dY:131;moveY:492downY:361
12-13 06:13:04.320 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:8
12-13 06:13:04.340 4328-4328/com.pulltorefresh.test E/cexo: dY:132;moveY:493downY:361
12-13 06:13:04.340 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:9
12-13 06:13:04.352 4328-4328/com.pulltorefresh.test E/cexo: dY:132;moveY:493downY:361
12-13 06:13:04.352 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:9
12-13 06:13:04.372 4328-4328/com.pulltorefresh.test E/cexo: dY:135;moveY:496downY:361
12-13 06:13:04.372 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:11
12-13 06:13:04.388 4328-4328/com.pulltorefresh.test E/cexo: dY:137;moveY:498downY:361
12-13 06:13:04.388 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:12
12-13 06:13:04.404 4328-4328/com.pulltorefresh.test E/cexo: dY:137;moveY:498downY:361
12-13 06:13:04.404 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:12
12-13 06:13:04.420 4328-4328/com.pulltorefresh.test E/cexo: dY:138;moveY:499downY:361
12-13 06:13:04.420 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:12
12-13 06:13:04.440 4328-4328/com.pulltorefresh.test E/cexo: dY:140;moveY:501downY:361
12-13 06:13:04.440 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:13
12-13 06:13:04.456 4328-4328/com.pulltorefresh.test E/cexo: dY:140;moveY:501downY:361
12-13 06:13:04.456 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:13
12-13 06:13:04.488 4328-4328/com.pulltorefresh.test E/cexo: dY:140;moveY:501downY:361
12-13 06:13:04.488 4328-4328/com.pulltorefresh.test E/cexo: paddingTop:13
12-13 06:13:08.040 4328-4328/com.pulltorefresh.test E/cexo: dY:-196;moveY:165downY:361
12-13 06:13:08.056 4328-4328/com.pulltorefresh.test E/cexo: dY:-192;moveY:169downY:361
12-13 06:13:08.072 4328-4328/com.pulltorefresh.test E/cexo: dY:-188;moveY:173downY:361
12-13 06:13:08.088 4328-4328/com.pulltorefresh.test E/cexo: dY:-184;moveY:177downY:361
12-13 06:13:08.104 4328-4328/com.pulltorefresh.test E/cexo: dY:-179;moveY:182downY:361
12-13 06:13:08.120 4328-4328/com.pulltorefresh.test E/cexo: dY:-174;moveY:187downY:361
12-13 06:13:08.140 4328-4328/com.pulltorefresh.test E/cexo: dY:-169;moveY:192downY:361
12-13 06:13:08.156 4328-4328/com.pulltorefresh.test E/cexo: dY:-165;moveY:196downY:361
12-13 06:13:08.172 4328-4328/com.pulltorefresh.test E/cexo: dY:-162;moveY:199downY:361
12-13 06:13:08.188 4328-4328/com.pulltorefresh.test E/cexo: dY:-161;moveY:200downY:361
12-13 06:13:08.208 4328-4328/com.pulltorefresh.test E/cexo: dY:-159;moveY:202downY:361
12-13 06:13:08.224 4328-4328/com.pulltorefresh.test E/cexo: dY:-158;moveY:203downY:361
12-13 06:13:08.240 4328-4328/com.pulltorefresh.test E/cexo: dY:-156;moveY:205downY:361
12-13 06:13:08.256 4328-4328/com.pulltorefresh.test E/cexo: dY:-155;moveY:206downY:361
12-13 06:13:08.272 4328-4328/com.pulltorefresh.test E/cexo: dY:-153;moveY:208downY:361
12-13 06:13:08.288 4328-4328/com.pulltorefresh.test E/cexo: dY:-153;moveY:208downY:361
12-13 06:13:08.308 4328-4328/com.pulltorefresh.test E/cexo: dY:-151;moveY:210downY:361
12-13 06:13:08.324 4328-4328/com.pulltorefresh.test E/cexo: dY:-152;moveY:209downY:361
12-13 06:13:10.840 4328-4328/com.pulltorefresh.test E/cexo: dY:-231;moveY:130downY:361
12-13 06:13:10.856 4328-4328/com.pulltorefresh.test E/cexo: dY:-225;moveY:136downY:361
12-13 06:13:10.872 4328-4328/com.pulltorefresh.test E/cexo: dY:-218;moveY:143downY:361
12-13 06:13:10.888 4328-4328/com.pulltorefresh.test E/cexo: dY:-214;moveY:147downY:361
12-13 06:13:10.904 4328-4328/com.pulltorefresh.test E/cexo: dY:-207;moveY:154downY:361
12-13 06:13:10.924 4328-4328/com.pulltorefresh.test E/cexo: dY:-203;moveY:158downY:361
12-13 06:13:10.940 4328-4328/com.pulltorefresh.test E/cexo: dY:-198;moveY:163downY:361
12-13 06:13:10.956 4328-4328/com.pulltorefresh.test E/cexo: dY:-194;moveY:167downY:361
12-13 06:13:10.972 4328-4328/com.pulltorefresh.test E/cexo: dY:-190;moveY:171downY:361
12-13 06:13:10.984 4328-4328/com.pulltorefresh.test E/cexo: dY:-187;moveY:174downY:361
12-13 06:13:11.004 4328-4328/com.pulltorefresh.test E/cexo: dY:-185;moveY:176downY:361
12-13 06:13:11.024 4328-4328/com.pulltorefresh.test E/cexo: dY:-182;moveY:179downY:361
12-13 06:13:11.040 4328-4328/com.pulltorefresh.test E/cexo: dY:-179;moveY:182downY:361
12-13 06:13:11.056 4328-4328/com.pulltorefresh.test E/cexo: dY:-178;moveY:183downY:361
12-13 06:13:11.072 4328-4328/com.pulltorefresh.test E/cexo: dY:-176;moveY:185downY:361
12-13 06:13:11.092 4328-4328/com.pulltorefresh.test E/cexo: dY:-172;moveY:189downY:361
12-13 06:13:11.104 4328-4328/com.pulltorefresh.test E/cexo: dY:-173;moveY:188downY:361
12-13 06:13:11.124 4328-4328/com.pulltorefresh.test E/cexo: dY:-171;moveY:190downY:361
12-13 06:13:11.140 4328-4328/com.pulltorefresh.test E/cexo: dY:-171;moveY:190downY:361
12-13 06:13:11.156 4328-4328/com.pulltorefresh.test E/cexo: dY:-171;moveY:190downY:361

看這標紅的第二次DOWN的日誌輸出,竟然dy<0,形成它小於0的緣由是因爲moveY<downY,而downY的值竟然一直是第一次DOWN時記錄的位置,那這是爲啥呢?仍是因爲跟上次補救downY的那句代碼有關:

這時要解決這個問題也比較簡單,在UP的時候將downY清零既可,以下:

這時再運行:

嗯~~成功又解掉了一個BUG,不過~~BUG不斷,再來演示一下:

正常向下滑動時只有列表處於第一位時才能拉出頭部,如今是無論是第向位均可以拉出頭部,所時這時須要判斷是否列表已經滑到最底端了,這時須要藉助一個工具類,以下:

public class RefreshScrollingUtil {

    private RefreshScrollingUtil() {
    }


    public static boolean isScrollViewOrWebViewToTop(View view) {
        return view != null && view.getScrollY() == 0;
    }

    public static boolean isAbsListViewToTop(AbsListView absListView) {
        if (absListView != null) {
            int firstChildTop = 0;
            if (absListView.getChildCount() > 0) {
                // 若是AdapterView的子控件數量不爲0,獲取第一個子控件的top
                firstChildTop = absListView.getChildAt(0).getTop() - absListView.getPaddingTop();
            }
            if (absListView.getFirstVisiblePosition() == 0 && firstChildTop == 0) {
                return true;
            }
        }
        return false;
    }

    public static boolean isRecyclerViewToTop(RecyclerView recyclerView) {
        if (recyclerView != null) {
            RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
            if (manager == null) {
                return true;
            }
            if (manager.getItemCount() == 0) {
                return true;
            }

            if (manager instanceof LinearLayoutManager) {
                LinearLayoutManager layoutManager = (LinearLayoutManager) manager;

                int firstChildTop = 0;
                if (recyclerView.getChildCount() > 0) {
                    // 處理item高度超過一屏幕時的狀況
                    View firstVisibleChild = recyclerView.getChildAt(0);
                    if (firstVisibleChild != null && firstVisibleChild.getMeasuredHeight() >= recyclerView.getMeasuredHeight()) {
                        if (android.os.Build.VERSION.SDK_INT < 14) {
                            return !(ViewCompat.canScrollVertically(recyclerView, -1) || recyclerView.getScrollY() > 0);
                        } else {
                            return !ViewCompat.canScrollVertically(recyclerView, -1);
                        }
                    }

                    // 若是RecyclerView的子控件數量不爲0,獲取第一個子控件的top

                    // 解決item的topMargin不爲0時不能觸發下拉刷新
                    View firstChild = recyclerView.getChildAt(0);
                    RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) firstChild.getLayoutParams();
                    firstChildTop = firstChild.getTop() - layoutParams.topMargin - getRecyclerViewItemTopInset(layoutParams) - recyclerView.getPaddingTop();
                }

                if (layoutManager.findFirstCompletelyVisibleItemPosition() < 1 && firstChildTop == 0) {
                    return true;
                }
            } else if (manager instanceof StaggeredGridLayoutManager) {
                StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) manager;

                int[] out = layoutManager.findFirstCompletelyVisibleItemPositions(null);
                if (out[0] < 1) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 經過反射獲取RecyclerView的item的topInset
     *
     * @param layoutParams
     * @return
     */
    private static int getRecyclerViewItemTopInset(RecyclerView.LayoutParams layoutParams) {
        try {
            Field field = RecyclerView.LayoutParams.class.getDeclaredField("mDecorInsets");
            field.setAccessible(true);
            // 開發者自定義的滾動監聽器
            Rect decorInsets = (Rect) field.get(layoutParams);
            return decorInsets.top;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }



}

裏面包含幾種控件判斷是否在頂端的方法,其中標紅的是既是我們須要用到的判斷是否RecyclerView到頂端的方法,因而乎在onInterceptTouchEvent()的MOVE事件中增長該條件判斷,以下:

這時能夠採用在onFinishInflate()來獲取,由於它是在當前視圖以及它的子視圖都加載完成以後會回調它,因此直接獲取RefreshLayout的第二個孩子既可recyclerView,第一個孩子是我們事先添加的頭部視圖,因此代碼以下:

這時再運行:

終於完美了~~篇幅巨長~~需好好消化~~

相關文章
相關標籤/搜索