我研究了代码DrawerLayout
并发现了下一个问题:当我们触摸屏幕边缘时,会出现一小部分(20*密度像素)drawer
(它使移动抽屉更容易)。它不会立即出现,而是在一定的时间间隔(160 毫秒)之后出现。它是由 实现的postDelayed
。
drawer
可以有几种状态IDLE
:DRAGGING
和SETTLING
。如果它处于该DRAGGING
状态,它不能再以相同的指针和边缘返回到该状态(因为有一个条件:mEdgeDragsInProgress[pointerId] & edge) == edge
不允许拖动已经拖动的边缘)。
DRAGGING
所以在某些情况下,当延迟Runnable
执行时,抽屉已经转移到状态。此延迟操作打开drawer
20*density px 并更改drawer
. 所以drawer
不能再移动(因为它不能返回状态DRAGGING
)。
有一个取消延迟操作的代码(打开抽屉),但是这个代码在方法onInterceptTouchEvent
中,它只被调用一次(因为它返回false
)。我认为这段代码应该在方法中onTouchEvent
。
不幸的是,我没有找到任何方法来取消延迟事件(因为它有private
修饰符,我无法得到它)。所以我只找到了一种方法:将源代码复制DrawerLayout
到我的项目并进行这个小改动:复制
case MotionEvent.ACTION_MOVE: {
// If we cross the touch slop, don't perform the delayed peek for an edge touch.
if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) {
mLeftCallback.removeCallbacks();
mRightCallback.removeCallbacks();
}
break;
}
从方法onInterceptTouchEvent
到方法onTouchEvent
。