记录Android中使用ViewDragHelper实现拖动View滑动的方法

ViewDragHelper通常是在一个ViewGroup内部使用。使用步骤如下:
1.初始化ViewDragHelper:在一个自定义的ViewGroup里面(暂且命名为TestViewGroup),通过ViewDragHelper静态工厂方法初始化。

ViewDragHelper viewDragHelper = ViewDragHelper.create(TestViewGroup.this,callback);

这里需要一个ViewDragHelper.Callback

private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {

    //何时开始检测触摸事件
    @Override
    public boolean tryCaptureView(@NonNull View child, int pointerId) {
        //这里可以设置一个条件,返回该条件的结果
        //当该条件结果为true时,开始检测触摸事件
        return true;
    }

    //处理水平滑动
    @Override
    public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
        return left;
    }

    //处理垂直滑动
    @Override
    public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
        return top;
    }

    //拖动结束手指释放后
    @Override
    public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {
        super.onViewReleased(releasedChild, xvel, yvel);
        //这里进行的是让view返回原点的操作
        mViewDragHelper.smoothSlideViewTo(mChildView, 0, 0);
        ViewCompat.postInvalidateOnAnimation(TestViewGroup.this);
    }
};

2.重写事件拦截方法,将事件传递给ViewDragHelper处理。代码如下:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return mViewDragHelper.shouldInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    //这里必须将触摸事件传递给ViewDragHelper
    mViewDragHelper.processTouchEvent(event);
    return true;
}

3.处理computeScroll(),代码模板如下:

@Override
public void computeScroll() {
    super.computeScroll();
    if (mViewDragHelper.continueSettling(true)) {
        ViewCompat.postInvalidateOnAnimation(TestViewGroup.this);
    }
}

4.处理1中callback中对应的方法。详见1中注解
5.获取一下子view以对其进行操作

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mChildView = getChildAt(0);
}

6.相关xml布局



    

你可能感兴趣的:(记录Android中使用ViewDragHelper实现拖动View滑动的方法)