我已经按照教程Navigation Drawer进行了操作,除了小故障外,一切都像魅力一样。我会尝试尽可能地解释它,如果仍然不清楚,我会尝试上传问题的视频。
当试图打开抽屉并且仅在打开时出现问题,并且有时仅发生,而不是总是发生。那是当我开始打开它时,毛刺和冻结约4毫米打开,并始终保持相同的距离。如果我把手指放回去,那么它就不会继续打开或关闭,当我放开它关闭时。
请注意:
任何指针都会受到赞赏。
答案 0 :(得分:25)
我研究了DrawerLayout
的代码并找到了下一个问题:
当我们触摸屏幕的边缘时,drawer
会出现小的(20 *密度px)部分(它使移动抽屉更容易)。它不是立即出现,而是在一定时间间隔(160毫秒)之后出现。它由postDelayed
实现。
drawer
可以处于以下几种状态:IDLE
,DRAGGING
和SETTLING
。如果它处于DRAGGING
状态,则它不能再使用相同的指针和边缘返回到此状态(因为有一个条件:mEdgeDragsInProgress[pointerId] & edge) == edge
不允许拖动已拖动的边缘已经)。
因此,在某些情况下,当延迟DRAGGING
正在执行时,抽屉已经移动到状态Runnable
。对于20 *密度px,此延迟操作会打开drawer
并更改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
。
答案 1 :(得分:1)
drawerlayout文件中没有错误。 只需将ScrollView作为父视图或根视图添加到content.xml(setcontentview文件)文件中即可 工具:上下文= “MainActivity”