實現下拉重新整理,上拉載入可自定義各種動畫
阿新 • • 發佈:2019-01-01
一、使用說明
1、UltimateRefreshView 支援ListView,GridView,ScrollView,WebVIew,RecyclerView(只支援LinearLayoutManager).
2、佈局使用:
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中如果參照這個值來做縮放哪必然會有問題。
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> |