盒子
盒子
文章目录
  1. 开门撞山:
  2. 实际应用场景
  3. 总结

[饼干]ViewDragHelper.Callback.onEdgeLock是干嘛的么

声明:博文未经授权一律不允转载

开门撞山:

ViewDragHelper.Callback提供给我们很多回调,灰常方便,网上很多文章都非常棒和详细,如果你还不知道ViewDragHelper这个神器怎么用,那你先去看看这些文章,不然下文你也看不懂。

有一个回调大家都没有在意,或者说描述的含糊不清,这里要说的回调就是:

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

默认是返回false,从方法字面上去理解,那就是边缘锁定,我试着判断一个边缘然后返回true看看,是否边缘拖拽就失效了呢,代码如下:

@Override
public boolean onEdgeLock(int edgeFlags) {
    return (edgeFlags&ViewDragHelper.EDGE_LEFT)==ViewDragHelper.EDGE_LEFT;
}

显然结果和我预料的并不一样,难道这个方法是要手动调用的咩?这个时候咋办呢,当然是看源码,记住,一切答案都在源码。

demo0

注意1278行,源码中确实调用了onEdgeLock,为什么没有跑到这句,这里有些线索,比如:

  • absDelta < absODelta * 0.5f,绝对值后新旧数据的比较

但是线索还不够,那就往上爬,找到checkNewEdgeDrag方法被调用的地方。当是LEFT和RIGHT的时候传入的是dx和dy,而TOP和BOTTOM的时候传入的是dy和dx,dx和dy调换了位置,恍然大悟了。

demo1

不多说,我把代码直接翻译成中文:

  • 当想要锁住的是或者的时候,如果左右滑动的距离还没上下滑动的距离的一半多,那就走回调onEdgeLock();
  • 当想要锁住的是或者的时候,如果上下滑动的距离还没左右滑动的距离的一半多,那就走回调onEdgeLock();

当我们开启了边缘锁定模式,像这样:

viewDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);//这里锁定左边

之后,我们在左边缘上下滑动的时候,就能够走回调onEdgeLock方法了。

看看红框框出来的部分,

实际应用场景

  • 微信边滑退出,识别是边滑的时候锁定只能是左右滑,而不能是上下滑。

    • 当然我们可以自己在别的ViewDragHelper.Callback的回调中做限制,比如clampViewPositionHorizontal和clampViewPositionVertical,但是,神经病啊,用原生的不用你写那么多的判断逻辑啊。
  • 我写的Demo在这里,请享用:

总结

  • 答案都在源码.
  • Stay hungry stay foolish!

仅作知识点记录,如有疏漏,全(欢)都(迎)怪(指)你(正)。

支持一下
扫一扫,支持Halohoop