通过 ViewDragHelper 基本可以实现各种不同的滑动需求, 但其使用方法也是复杂的, 这里记录对ViewDragHelper的使用方法.
ViewDragHelper的使用步骤:
1.初始化ViewDragHelper
ViewDragHelper 通常定义在一个 ViewGroup的内部,并通过其静态工厂方法进行初始化.
mDragHelper = ViewDragHelper.create(this, new DragCallback());
第一个参数是要监听的 View , 通常需要是一个ViewGroup ,即parentView, 第二参数是一个回调, 是控制滑动的核心.
2.设置拦截事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mDragHelper != null) {
return mDragHelper.shouldInterceptTouchEvent(ev);
} else {
return super.onInterceptTouchEvent(ev);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
try {
mDragHelper.processTouchEvent(event);
} catch (Exception e) {
e.printStackTrace();
}
//process all touch event
return true;
}
3.处理 computeScroll()
@Override
public void computeScroll() {
super.computeScroll();
if (mDragHelper.continueSettling(true)) {
ViewCompat.postInvalidateOnAnimation(this);
}
}
4.处理回调 Callback
ViewDragHelper回调中提供了一系列接口, 可以根据自身需求, 来有选择的去重写对应接口, 下面列出一些常用需要重写的接口:
private class DragCallback extends ViewDragHelper.Callback {
/*
* 何时开始检测触摸事件, 返回true, 一直检测触摸事件, 返回false, 不检测.
*/
@Override
public boolean tryCaptureView(View child, int pointerId) {
return true;
}
/*
* 设置水平方向可以滑动的范围, 对应设置垂直方向滑动范围接口getViewVerticalDragRange
*/
@Override
public int getViewHorizontalDragRange(View child) {
return mDragRange;
}
/*
* 获得水平方向的滑动距离, 默认为0, 不滑动
* left: 水平方向滑动距离
* dx: 滑动增量, 距上次滑动距离
*/
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
/*
* 获得垂直方向的滑动距离, 默认为0, 不滑动
* top: 垂直方向滑动距离
* dy: 滑动增量, 距上次滑动距离
*/
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return top;
}
/*
* 当view的位置发生变化时回调
* changedView: 位置改变的控件
* left: 水平方向移动的距离
* top: 垂直方向移动距离
* dx: 水平方向增量
* dy: 垂直方向增量
*/
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
}
/*
* 滑动结束后,回调此方法
*/
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
}
}
使用ViewDragHelper实现侧滑菜单的例子: DragMenu