天天看点

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

继续阅读