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

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