天天看點

Android:随筆——自定義View的好幫手 ViewDragHelper

轉載請标明位址 QuincySx http://www.jianshu.com/p/e19a8735b123

ViewDragHelper是用于編寫自定義ViewGroups的實用工具類。它提供了許多有用的操作和狀态跟蹤,允許使用者拖動和重新定位其父ViewGroup中的視圖。

在自定義View裡如何建立 ViewDragHelper

第一步

mDragHelper = ViewDragHelper.create(this, 1f, mCallback);

第一個參數傳 ViewGroup 、第二個參數傳 Float 代表靈敏度 預設為 1.0f 值越大靈敏度越高 、第三個參數為 ViewDragHelper.Callback

第二步 重寫 ViewGroup 的 onInterceptTouchEvent 方法

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

return mDragHelper.shouldInterceptTouchEvent(ev);

}

第三步 重寫 ViewGroup 的 onTouchEvent 方法,并且傳回 true

public boolean onTouchEvent(MotionEvent event) {

mDragHelper.processTouchEvent(event);

return true;

下面再介紹一下 ViewDragHelper.Callback 下面簡稱 Callback

這是 Callback 的方法 ( 直接點選方法名可以直接觀看 Google 的官方文檔 )

隻有此方法才是預設實作的方法 除此之外其他方法都需要自行按需實作

abstract boolean [tryCaptureView](

https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#tryCaptureView(android.view.View

, int))(View child, int pointerId)

此方法是判斷子 View 是否能夠響應事件,如果傳回 true 則目前 View 能夠響應事件,反之則不能

int [clampViewPositionHorizontal]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#clampViewPositionHorizontal(android.view.View

, int, int))(View child, int left, int dx)

限制子 View 隻能沿着 X 軸 運動,也就是隻能水準運動, 傳回值是子 View 左邊的距離

int [clampViewPositionVertical]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#clampViewPositionVertical(android.view.View

, int, int))(View child, int top, int dy)

限制子 View 隻能沿着 Y 軸 運動,也就是隻能豎直運動, 傳回值是子 View 上邊的距離

int getOrderedChildIndex

(int index)

如果在同一個位置有兩個子View重疊,想要讓下層的子View被選中,那麼就要實作這個方法來改變查找子View的順序

getViewHorizontalDragRange

(View child)

傳回可拖動子 View 的水準移動範圍。對于不能水準移動的視圖,此方法應傳回0。

getViewVerticalDragRange 傳回可拖動子 View 的豎直移動範圍。對于不能豎直移動的視圖,此方法應傳回0。
void [onEdgeDragStarted]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onEdgeDragStarted(int

, int))(int edgeFlags, int pointerId)

當 onEdgeTouched 被調用時,則該方法被調用

mDragHelper.captureChildView(mImageView, pointerId);

boolean onEdgeLock

(int edgeFlags)

待完善

void [onEdgeTouched]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onEdgeTouched(int 當監聽到 ViewGroup 的滑動事件沒有被子 View 所消費掉時,觸發此事件(就是當沒有滑動在子 View 上的情況)
void [onViewCaptured]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onViewCaptured(android.view.View

, int))(View capturedChild, int activePointerId)

當子 View 位置開始發生改變時 響應此方法,與 onViewReleased 相對應

void onViewDragStateChanged

(int state)

拖動狀态改變時 響應此接口

STATE_IDLE

STATE_DRAGGING

STATE_SETTLING

void [onViewPositionChanged]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onViewPositionChanged(android.view.View

, int, int, int, int))(View changedView, int left, int top, int dx, int dy)

當 View 位置改變時,調用此方法,這個方法與 onViewCaptured 不同,此方法隻要位置發生變化就會響應,而 onViewCaptured 隻會在子 View 位置發生變化的時候被調用一次

void [onViewReleased]( https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onViewReleased(android.view.View

, float, float))(View releasedChild, float xvel, float yvel)

當 View 釋放的時候回調,與 onViewCaptured相對應

總結

這裡我隻是解釋了一下怎麼使用,每個接口的意思,具體使用可能需要大家了解一下了,我以後寫自定義 View 會敲個 Demo 給大家分享一下的

未完待續。。。

Todo:具體Demo

繼續閱讀