(其實iOS的同學在實現功能的時候是隨意播放的。)
效果大概值得這樣:
在閱讀了UI之後,
“這個效果不錯。”
“為什麽不在安卓上做?”所以~ ~
作為壹個有抱負的程序員,我決定達到這樣的效果(腦子裏都是草和泥馬)
這樣的效果~ ~
利用自定義的ViewGroup,通過手勢的處理,應該可以實現吧?
主要應該分為兩部分:
比較麻煩的應該在第壹部分,需要對事件的分布有壹定的了解。
說到手勢判斷,就不可避免的要處理事件分布。
下拉部分
1.處理onInterceptTouchEvent中的事件。如果是下拉事件,截取事件,交給onTouchEvent處理。
2.在onTouchEvent中通過計算得到下拉距離,然後動態改變Header的配置,達到放大效果。
重置零件
重置onTouchEvent的ACTION_UP中的Header以實現反彈。
知道了思路之後,實現起來就比較簡單了。
創建壹個ViewGroup(因此命名為FlexibleLayout)來繼承LinearLayout。
對onInterceptTouchEvent的處理
第壹,是否是下拉事件,通過兩個條件判斷:
然後通過mIsBeingDragged來標記拖動的開始。
onTouchEvent的處理
修改頭部尺寸
得到下拉距離後,可以通過改變表頭的大小來達到放大的效果。
可以自由彈奏放大和復位的部分。
在這裏,我們使用數學。Pow (offset,0.8)得到實際要增加的高度,通過計算得到相應的寬度和偏移量(類似阻尼效果)。
重置磁頭
只需將寬度、高度和偏移量直接設置為原始參數。
(如果覺得復位過程不夠流暢,可以通過動畫完成壹個流暢的復位效果,這裏就不演示了。)
至此,壹個簡單的下拉和放大效果就完成了。試試效果
使用
只需將FlexibleLayout放在需要下拉放大的布局上,比如ScrollView。
影響
滾動視圖:
回收視圖:
CoordinatorLayout布局:
妳完了!!!
當然還有壹些細節的處理,比如下拉的條件,反彈的動畫,最大高度等等。具體內容可以在源代碼中看到。
完成下拉放大後,似乎忘記了壹個很重要的功能。
光顧這種下拉放大刷新怎麽辦?什麽?
這個功能留到下周,我的7小時睡眠還遠著呢~ ~
雖然沒有直接下拉刷新功能,但是在源代碼中已經曝光了壹個下拉監視器,妳也可以通過這個監視器實現下拉刷新操作。
它在這裏
(為了還清上周欠的債~ ~)
類似於下拉放大,通過對手指滑動的監控,利用視圖的平移和旋轉來實現移動和旋轉。
具體實施過程這裏就不貼了,直接看效果就好。
有興趣可以直接去Github看看源代碼和用法。
開源代碼庫
PullZoomView
Android事件分發機制詳細介紹,妳值得擁有。