Android 自定義View UC下拉重新整理效果(三)

joe發表於2016-11-10

這是山寨UC瀏覽器的下拉重新整理效果的的結尾篇了,到這裡,基本是實現了UC瀏覽器首頁的效果了!還沒有看之前的小夥伴記得出門左轉先看看喲(Android 自定義View UC下拉重新整理效果(一)Android 自定義View UC下拉重新整理效果(二))。期間也有不小的改動,主要集中在那個小圓球拖拽時的繪製方式上,可以看到,最後的圓球效果比之前的順暢漂亮了很多!!

Android 自定義View UC下拉重新整理效果(三)

pull.png

Android 自定義View UC下拉重新整理效果(三)

back.png

Android 自定義View UC下拉重新整理效果(三)

loading.png

Android 自定義View UC下拉重新整理效果(三)

PullRefreshfinal.gif

經過前面的兩篇文章,分別從小球動畫和下拉重新整理兩個方面介紹了相關的內容,最後還剩首頁顯示過渡列表展示的內容了!效果說明:

  • 1、向上滑動,背景和tab有個漸變效果
  • 2、向下滑動,有一個放大和圓弧出現

功能拆分

  • 1、展開關閉top預設值
    因為這裡有兩種狀態,一種是展開的,一種是首頁的關閉狀態,展開的預設top是TabLayout的對應高度加上自身的top值,而關閉時,預設top值是上面的CurveView的高度加上自身的top值。
  • 2、實現拖拽滑動效果
    首先想到的就是ViewDragHelper,使用它來控制相關的拖拽。
  • 3、拖拽背景漸變效果
    這個就是設定拖拽過程中相關的回撥。另外就是在首頁的狀態,ViewPager是沒法左右滑動的。
  • 4、繪製下拉的弧度
    這個就得使用到drawPath()繪製貝塞爾曲線了。

相關物件介紹

父佈局是一個CurveLayout,裡面包含三個物件:

sheet就是我們的拖拽目標ViewViewDragHelper拖拽輔助類,寫好對應的事件處理和Callback就可以實現拖拽功能了!這裡不詳細介紹。ViewOffsetHelper,對於它的介紹,可以看看下面的截圖:

Android 自定義View UC下拉重新整理效果(三)

ViewOffsetHelper.png

因為我們這裡只涉及上下的移動,所以介紹以下主要方法:

展開、關閉的預設top值

在addView()的方法中我們確定對應的Target,然後為其設定一個OnLayoutChangeListener

接下來看看OnLayoutChangeListener裡面的相關邏輯:

初始化sheetExpandedTop,currentTop等欄位,並且呼叫上面提到的onViewLayout(),同步ViewOffsetHelper的值。

拖拽滑動實現

ViewDragHelper就不多說了,Android自帶的輔助類,新增一個Callback,然後處理相關回撥方法就可以了!
判斷是否攔截處理事件:

這裡獲取的這個currentX是為了在下拉出現那個弧度的頂點。在接下來的回撥中會使用。

可以看到,在onViewPositionChanged()的方法中會去呼叫resyncOffsets()的方法同步ViewOffsetHelper的對應值。
onViewReleased()的方法中呼叫了animateSettle()的方法,兩種情況,一種是展開,一種是關閉(首頁的狀態),所以這裡有一個expand的變數來標識,如果展開,就展開到sheetExpandedTop的高度,關閉的話,那麼就是到dismissOffset的高度。

animateSettle()方法最終執行以下方法邏輯:

這裡有一個settleAnim的屬性動畫,傳入的是ViewOffsetHelper裡面的OFFSET_Y,在OFFSET_Yset()方法中,呼叫setTopAndBottomOffset()的方法去修改對應的top值,從而實現了鬆手後展開或者關閉的動畫效果。

拖拽背景漸變效果

說到背景的漸變效果,那麼肯定就是要講相關的回撥了!Callbacks用來處理對應的回撥,提供了三個方法:onSheetNarrowed(),onSheetExpanded(),onSheetPositionChanged(),分別對應的時候關閉了,展開了,和改變了三種情況。

onSheetPositionChanged(int sheetTop, float currentX, int dy, boolean userInteracted)的方法中,有四個引數,分別是當前的top值,當前touch的x值,豎直方向的改變值,以及是否是由開到關或者由關到開的情況。

在具體是實現中是這樣的:

可以看到,在onSheetPositionChanged()的方法中,首先是進行了一些值的初始化,然後根據reverse來判斷,如果不是由開到關或者由關到開的狀態改變,那麼就開始背景的移動或者背景的放大及畫出對應的弧形。另外在onSheetNarrowed()或者onSheetExpanded()中就是對View做的一些初始化或者重置操作!

繪製下拉的弧度

當是下拉的時候,需要繪製出弧形,這裡使用到了CurveView以及它的onDispatch()方法!

其實很簡單,就是使用當前的X值的座標和dy的值來進行drawPath()的操作。當然這裡有一個上限的限制。

到這裡,實現拖拽展開及關閉的邏輯就實現完成了,總結起來就是使用ViewDragHelper來輔助實現拖拽功能,在鬆手的時候呼叫ViewOffsetHelper來實現展開或者關閉的漸變動畫效果,期間呼叫Callbacks回撥對應的狀態(展開了、關閉了、位置變化了)。

圓球繪製邏輯改動

之前的第一篇文章中介紹的圓球拉伸繪製時採用的是drawArc()和drawPath結合的方法,所以看著總覺得有點兒怪,然後查了相關的資料,這裡使用了新的方式,請看圖:

Android 自定義View UC下拉重新整理效果(三)

網上拷的

意思就是一個圓形,可以理解為是採用了drawPath()畫了四段弧。每段弧就是使用path.cubicTo()繪製的貝塞爾曲線。

根據網上的資料,這裡的m的值就是半徑R*0.551915024494f。在豎直方向拖拽的過程中,其實就是改變這12個點的座標,從而繪製出想要的弧形。

專案下載:https://github.com/lovejjfg/UCPullRefresh

喜歡就請點個Start唄。。

參考資料

1、Plaid專案
2、三次貝塞爾曲線練習之彈性的圓

—- Edit By Joe —-

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

Android 自定義View UC下拉重新整理效果(三) Android 自定義View UC下拉重新整理效果(三)

相關文章