ViewDragHelper基本用法

作者: 咸鱼而已 | 来源:发表于2016-06-02 15:39 被阅读1723次

基本用法

1、自定义一个View
2、创建一个ViewDragHelper的实例
3、触摸相关的方法的调用
4、ViewDragHelper.Callback实例的编写

需要注意的地方:如果ViewGroup的子控件会消耗点击事件,例如按钮,在触摸屏幕的时候就会先走onInterceptTouchEvent方法,判断是否可以捕获,而在判断的过程中会去判断另外两个回调的方法:getViewHorizontalDragRange和getViewVerticalDragRange,只有这两个方法返回大于0的值才能正常的捕获。

注意如果需要使用边界检测需要添加上mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);

ViewDragHelper.Callback中的一些回调方法:

tryCaptureView()

    @Override
    public boolean tryCaptureView(View child, int pointerId) {
        return child == mDragView || child == mAutoBackView;
    }

返回true表示捕获当前touch到的view,可以根据第一个参数child决定捕获哪些view。child是当前触摸到的view。这里的返回代表mDragView和mAutoBackView可以被捕获。

clampViewPositionHorizontal()

    @Override
    public int clampViewPositionHorizontal(View child, int left, int dx) {
        return left;
    }

在该方法中对child移动的边界进行控制,left表示即将移动到的位置。比如横向的情况下,我希望只在ViewGroup的内部移动,即:最小>=paddingleft,最大<=ViewGroup.getWidth()-paddingright-child.getWidth

clampViewPositionVertical()

    @Override
    public int clampViewPositionVertical(View child, int top, int dy) {
        return top;
    }

与上面的类似,控制纵向移动的时候边界的控制

onViewReleased()

    public void onViewReleased(View releasedChild, float xvel, float yvel) {
        super.onViewReleased(releasedChild, xvel, yvel);
        //mAutoBackView手指释放时可以自动回去
        if (releasedChild == mAutoBackView)
        {
            //settleCapturedViewAt可以设置捕获的view到指定的位置,传入的参数是x、y的值
            mDragger.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y);
            invalidate();
        }
    }

手指离开当前捕获的View的时候,会回调这个方法

onEdgeDragStarted()

    public void onEdgeDragStarted(int edgeFlags, int pointerId)
    {
        //captureChildView可以捕获view,并且绕过tryCaptureView,所以就算是tryCaptureView没有返回true也没关系
        mDragger.captureChildView(mEdgeTrackerView, pointerId);
    }

在边界拖动时回调

getViewHorizontalDragRange()

    @Override
    public int getViewHorizontalDragRange(View child) {
        super.getViewHorizontalDragRange(child);
        return getMeasuredWidth() - child.getMeasuredWidth();
    }
    @Override
    public int getViewVerticalDragRange(View child) {
        super.getViewVerticalDragRange(child);
        return getMeasuredHeight() - child.getMeasuredHeight();
    }

方法的返回值应当是该childView横向或者纵向的移动的范围,当前如果只需要一个方向移动,可以只复写一个。

onViewDragStateChanged()

    @Override
    public void onViewDragStateChanged(int state) {
        super.onViewDragStateChanged(state);
        Log.d("zwf", String.valueOf(state));
    }

当ViewDragHelper状态发生变化的时候调用(IDLE,DRAGGING,SETTING[自动滚动时])

onViewPositionChanged()

    @Override
    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
        super.onViewPositionChanged(changedView, left, top, dx, dy);
    }

当captureView的位置发生变化是回调
@param changedView
@param left 将要移动到的x轴方向的位置
@param top 将要移动到的y轴方向的位置
@param dx x轴偏移量
@param dy y轴偏移量

onViewCaptured()

    @Override
    public void onViewCaptured(View capturedChild, int activePointerId) {
        super.onViewCaptured(capturedChild, activePointerId);
    }

当captureView被捕获的时候调用

onEdgeTouched()

    @Override
    public void onEdgeTouched(int edgeFlags, int pointerId) {
        super.onEdgeTouched(edgeFlags, pointerId);
    }

触摸到边界 的时候调用

onEdgeLock()

    @Override
    public boolean onEdgeLock(int edgeFlags) {
        return super.onEdgeLock(edgeFlags);
    }

返回true会锁住当前的边界

getOrderedChildIndex()

    @Override
    public int getOrderedChildIndex(int index) {
        return super.getOrderedChildIndex(index);
    }

改变同一个坐标(x,y)去寻找captureView位置的方法

相关文章

网友评论

    本文标题:ViewDragHelper基本用法

    本文链接:https://www.haomeiwen.com/subject/karkdttx.html