android ViewDragHelper介紹與使用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章