ViewDragHelper.CallBack中每个方法的用法

ViewDragHelper.CallBack中每个方法的用法。

转载请表明出处:http://blog.csdn.net/coder_nice/article/details/44678153

假如你还不太了解DragHelper,请先看这片文章:http://blog.csdn.net/coder_nice/article/details/44592989


clampViewPositionHorizontal();

先看代码:

    @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            final int leftBound = getPaddingLeft();
            final int rightBound = getWidth() - mDragView.getWidth();
            final int newLeft = Math.min(Math.max(left, leftBound), rightBound);
            return newLeft;
        }
此方法是用来控制水平方向移动的范围,每次调用
  • 拿到当前的left值跟DragLayout的根布局的paddingleft值做比较,取两者中大的值,这样做是为了防止子view左边滑出根布局的左边界。
  • 拿left和padding left中的较大值跟可滑动范围的右边界(根布局宽度减去子view的宽度)作比较,取较小值,这样做是为了防止子view右边滑出根布局右边界。
类似的clampViewPositionVertical()方法也就明白了。

getViewVerticalDragRange()

从字面意思就可以看出这是一个获取边界的方法,先看代码。

    @Override
        public int getViewVerticalDragRange(View child) {
            return mDragRange;
        }

然后看看mDragRange是怎么赋值的:

@Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        mDragRange = getHeight() - mHeaderView.getHeight();
    }

所以很清楚了,范围值在最初测量摆放子view时,在onLayout方法就已经确定了。

类似的getViewHorizontalDragRange()也就明白了。

tryCaptureView()

确定当前子view是否可拖动,用法很简单。看看代码:

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

这段代码表明只有当view是mHeaderView才可以拖动,其他子View都不可拖动。


onViewPositionChanged()

该方法在子view位置发生改变时都会被调用,可以在这个方法中做一些拖动过程中渐变的动画等操作,看看代码:

    @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            mTop = top;
            mDragOffset = (float) top / mDragRange;
        mHeaderView.setPivotX(mHeaderView.getWidth());
        mHeaderView.setPivotY(mHeaderView.getHeight());
            mHeaderView.setScaleX(1 - mDragOffset / 2);
            mHeaderView.setScaleY(1 - mDragOffset / 2);
            mDescView.setAlpha(1 - mDragOffset);
            requestLayout();
        }

这段代码的意思是mHeaderView随着Y轴方向的位置变化做缩放,mDescView随着Y轴方向的位置变化做渐变,然后重绘界面。


onViewReleased()

该方法在手势拖动释放的时候被调用,可以在这里设置子View预期到达的位置,如果人为的手势拖动没有到达预期位置,我们可以让子View在人为的拖动结束后,再自动关的滑动到指定位置,看看代码:

    @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            int top = getPaddingTop();
            if (yvel > 0 || (yvel == 0 && mDragOffset > 0.5f)) {
                top += mDragRange;
            }   mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top);
            invalidate();
        }

这段代码的意思是当人为的拖动结束后,如果没有到达顶部,则设置view自动滑动到顶部。
当然在onViewReleased()方法中还可以做一些其他的后续操作。


onEdgeTouched()

该方法很好理解了,就是当你触碰到边界时就会被调用。

前提是已经在DragHelper中设置了开启边界使用的模式,都则该方法不会被掉起,设置开启边界模式代码如下:

dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);

这就算开启了左侧边界模式


onEdgeDragStarted()

前提是已经在DragHelper中设置了开启边界使用的模式,都则该方法不会被掉起,设置开启边界模式代码如下:

dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);

这就算开启了左侧边界模式
该方法比较有意思,当人为的从边界拖动(此时并没有拖动子view)时,可以选择关联某一个子view,实现只要从边界拖动,不管是否触碰到子view,都能控制子view一起拖动的效果,看看代码:

    @Override
        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
            super.onEdgeDragStarted(edgeFlags, pointerId);
            dragHelper.captureChildView(mDragView, pointerId);
        }

相当于把mDragView传递给了dragHelper,让mDragView关联到从边界开始的拖动。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值