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
@Override
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的顺序
int getViewHorizontalDragRange(View child)
返回可拖动子 View 的水平移动范围。对于不能水平移动的视图,此方法应返回0。
int getViewVerticalDragRange(View child)
返回可拖动子 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, int))(int edgeFlags, int pointerId)
当监听到 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
网友评论