通過 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