声明:博文未经授权一律不允转载
开门撞山:
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;
}
显然结果和我预料的并不一样,难道这个方法是要手动调用的咩?这个时候咋办呢,当然是看源码,记住,一切答案都在源码。
注意1278行,源码中确实调用了onEdgeLock,为什么没有跑到这句,这里有些线索,比如:
- absDelta < absODelta * 0.5f,绝对值后新旧数据的比较
但是线索还不够,那就往上爬,找到checkNewEdgeDrag方法被调用的地方。当是LEFT和RIGHT的时候传入的是dx和dy,而TOP和BOTTOM的时候传入的是dy和dx,dx和dy调换了位置,恍然大悟了。
不多说,我把代码直接翻译成中文:
- 当想要锁住的是左或者右的时候,如果左右滑动的距离还没上下滑动的距离的一半多,那就走回调onEdgeLock();
- 当想要锁住的是上或者下的时候,如果上下滑动的距离还没左右滑动的距离的一半多,那就走回调onEdgeLock();
当我们开启了边缘锁定模式,像这样:
viewDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);//这里锁定左边
之后,我们在左边缘上下滑动的时候,就能够走回调onEdgeLock方法了。
看看红框框出来的部分,
实际应用场景
微信边滑退出,识别是边滑的时候锁定只能是左右滑,而不能是上下滑。
- 当然我们可以自己在别的ViewDragHelper.Callback的回调中做限制,比如clampViewPositionHorizontal和clampViewPositionVertical,但是,神经病啊,用原生的不用你写那么多的判断逻辑啊。
我写的Demo在这里,请享用:
总结
- 答案都在源码.
- Stay hungry stay foolish!
仅作知识点记录,如有疏漏,全(欢)都(迎)怪(指)你(正)。