轉載請标明位址 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