在自定義ViewGroup的過(guò)程中,如果涉及到View的拖動(dòng)滑動(dòng),ViewDragHelper的使用應(yīng)該是少不了的,它提供了一系列用于用戶(hù)拖動(dòng)子View的輔助方法和相關(guān)的狀態(tài)記錄,像Navigation Drawer的邊緣滑動(dòng)、QQ5.x的側(cè)滑菜單、知乎里的頁(yè)面滑動(dòng)返回都可以由它實(shí)現(xiàn),所以有必要完全掌握它的使用。
要想完全掌握ViewDragHelper的使用和原理,最好的辦法就是讀懂它的源碼,所以就有了這篇分析,以便在印象模糊之時(shí)可以再次快速回顧ViewDragHelper的原理、用法、注意事項(xiàng)等。
基本用法
1.在自定義ViewGroup的構(gòu)造方法里調(diào)用ViewDragHelper的靜態(tài)工廠(chǎng)方法create()創(chuàng)建ViewDragHelper實(shí)例
2.實(shí)現(xiàn)ViewDragHelper.Callback
最重要的幾個(gè)方法是tryCaptureView()、clampViewPositionVertical()、clampViewPositionHorizontal()、getViewHorizontalDragRange()、getViewVerticalDragRange()
tryCaptureView()里會(huì)傳遞當(dāng)前觸摸區(qū)域下的子View實(shí)例作為參數(shù),如果需要對(duì)當(dāng)前觸摸的子View進(jìn)行拖拽移動(dòng)就返回true,否則返回false。
clampViewPositionVertical()決定了要拖拽的子View在垂直方向上應(yīng)該移動(dòng)到的位置,該方法會(huì)傳遞三個(gè)參數(shù):要拖拽的子View實(shí)例、期望的移動(dòng)后位置子View的top值、移動(dòng)的距離。返回值為子View在最終位置時(shí)的top值,一般直接返回第二個(gè)參數(shù)即可。
clampViewPositionHorizontal()與clampViewPositionVertical()同理,只不過(guò)是發(fā)生在水平方向上,最終返回的是View的left值。
getViewVerticalDragRange()要返回一個(gè)大于0的數(shù),才會(huì)在在垂直方向上對(duì)觸摸到的View進(jìn)行拖動(dòng)。
getViewHorizontalDragRange()與getViewVerticalDragRange()同理,只不過(guò)是發(fā)生在水平方向上。
3.在onInterceptTouchEvent()方法里調(diào)用并返回ViewDragHelper的shouldInterceptTouchEvent()方法
4.在onTouchEvent()方法里調(diào)用ViewDragHelper()的processTouchEvent()方法。ACTION_DOWN事件發(fā)生時(shí),如果當(dāng)前觸摸點(diǎn)下要拖動(dòng)的子View沒(méi)有消費(fèi)事件,此時(shí)應(yīng)該在onTouchEvent()返回true,否則將收不到后續(xù)事件,不會(huì)產(chǎn)生拖動(dòng)。