1. 程式人生 > >實現下拉重新整理,上拉載入可自定義各種動畫

實現下拉重新整理,上拉載入可自定義各種動畫

一、使用說明 1、UltimateRefreshView 支援ListView,GridView,ScrollView,WebVIew,RecyclerView(只支援LinearLayoutManager). 2、佈局使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<com.sak.ultilviewlib.UltimateRefreshView
android:id="@+id/refreshView"
android:layout_width="match_parent"
android:layout_marginTop="150dp"
android:layout_height="300dp"
android:background="@color/colorAccent"
android:orientation="vertical">

<android.support.v7.widget.RecyclerView
android:background="@color/green"
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</com.sak.ultilviewlib.UltimateRefreshView>
3、可以根據需求來自定義下拉重新整理的動畫等等,動畫的處理均放到Adapter中。 例如:MeiTuanHeaderAdapter,只需要繼承BaseHeaderAdapter,就可回撥其中的方法來實現對動畫的控制。 二、原理讀解幫助 在讀原始碼的時候必然會遇到問題,但是不要心急,畢竟已經讀過,相信對你也會很簡單。 1、 對於這種巢狀形的重新整理控制元件,就是通過兩個方法onInterceptTouchEvent,onTouchEvent來對內部控制元件的事件攔截處理的。onInterceptTouchEvent通過返回值來判斷外層控制元件是否攔截手勢事件,return true時就是外層控制元件攔截並在onTouchEvent中去消費。通過上一個方法判斷是否進入外層控制元件的onTouchEvent方法,進入之後來進行處理。 2、
其實onTouchEvent方法中處理無非就是對於HeadView的topDistance(頂部座標)的設定,來進行頭佈局的隱藏和尾佈局的隱藏顯示等。讀到這裡肯定會懵逼,為啥尾部局也是設定HeadView的頂座標呢?下面我們畫個圖來解釋,但是解釋之前我們需要對addVIew()方法進行解釋。 3、addView() @param child the child view to add @param index the position at which to add the child or -1 to add last @param params the layout parameters to set on the child
*/ publicvoid addView(View child, int index, LayoutParams params) (1)這個方法是我們在UltimateRefreshView 初始化HeadView和FootView的時候呼叫的。 addView()方法是通過index來判斷將view加到哪裡的, (2)HeadView中addView(mHeaderView, 0, params);意思就是將HeadView加到最頂部,但並不是隱藏,隱藏是通過設定HeadView的Y軸頂座標實現的。 (3)FoodView中addView(mFooterView, params);其實這個方法就是預設index為-1,就是將底部距加到最底部,而他的隱藏是通過設定內部佈局的顯示高度實現的,將內部佈局(RecyclerView等)設定成march_parent就會將底部局擠下去。 4、畫圖。 5、Gif幫助理解。(這本身是源程式BUG,已修改了,但是有助於理解) 通過int topDi stance = FootViewControlUpdateHeadViewMarginTop(deltaY);修改的。 6、解讀為啥HeadViewAdapter有兩個下拉時方法。(讀的時候必然懵逼,因為現在的程式碼已經不能重現問題了,所以建議不要去讀,就記住做縮放相關操作時不要參照deltaY的方法就對了,使用Scale方法,他是基於HeadView的比例來算的) 背景:在MeiTuanHeadAdapter最一開始的時候發現有一個問題,就是不鬆手來回上下拉的時候圖片縮放會變成傻逼,放大的比例遠沒有縮小的大,LOG了一下發現Scale甚至到了-2.0,於是開始尋找這個問題所在。 1、問題已經清楚了吧,其實呢這個問題很簡單,他是因為onTouchEvent方法中下拉重新整理的設定時,initHeaderViewToRefresh()方法在給Adapter回撥值得時候的出的問題。 2、首先int topDistance = UpdateHeadViewMarginTop(deltaY);執行時用來設定HeadView的頂部Y軸座標的,而deltaY就是手勢相對於Down下的點Y軸方向滑動的距離,如果滑動到Down點的上邊就是負數,下邊就是負數。因為它是通過當前點到螢幕頂部的距離 - Down點距離頂部的距離計算的。 3、topDistance返回的是什麼呢,就是當前HeadView的Y軸座標,當HeadView完全隱藏時,這個值肯定是-mHeadViewHeight。而我們返回給下拉過程的方法pullViewToRefreshScale(),也是通過判斷這個的,但是當topDistance(HeadView頂部Y軸座標)大於0的時候說明HeadView已經顯示出來了,我們就設定成“鬆手重新整理”提示了。 4、那麼這個問題出現在哪呢?就是最一開始的對圖片的縮放時根據deltaY來作為依據的,問題就在於,他在放大時候不會超過1,而在縮小時會超過-1,因為我們設定頂部可以無限的拉出來,那麼這時的topDistance會大於0,而我們這時不鬆手讓他還原回去的話必然要和拉過來的距離一直,而這時deltaY又會回傳給Adapter,但是這時的值的絕對值必然要大於topDistance=0的時候的值,這時就出現問題了,也就是topDistance=0時如果傳回的值為150,那麼這時的值可能是 -200,而我們在adapter中如果參照這個值來做縮放哪必然會有問題。