27

我已经按照教程Navigation Drawer进行了操作,除了一个小故障之外,一切都像一个魅力。我会尽量解释清楚,如果仍然不清楚,我会尝试上传问题的视频。

尝试打开抽屉时会出现问题,并且仅在打开时才会发生,并且有时会发生,并非总是如此。那是当我开始打开它时,它会在打开约 4 毫米时出现故障并冻结,并且始终保持相同的距离。如果我向后移动手指,它就不会继续打开或关闭,当我松开时,它会关闭。

请注意:

任何指针将不胜感激。

4

2 回答 2

27

我研究了代码DrawerLayout并发现了下一个问题:当我们触摸屏幕边缘时,会出现一小部分(20*密度像素)drawer(它使移动抽屉更容易)。它不会立即出现,而是在一定的时间间隔(160 毫秒)之后出现。它是由 实现的postDelayed

drawer可以有几种状态IDLEDRAGGINGSETTLING。如果它处于该DRAGGING状态,它不能再以相同的指针和边缘返回到该状态(因为有一个条件:mEdgeDragsInProgress[pointerId] & edge) == edge不允许拖动已经拖动的边缘)。

DRAGGING所以在某些情况下,当延迟Runnable执行时,抽屉已经转移到状态。此延迟操作打开drawer20*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

于 2013-08-06T17:31:12.643 回答
1

抽屉布局文件中没有错误。只需将 ScrollView 作为父视图或根视图添加到 content.xml(setcontentview 文件)文件和工具:context=".MainActivity"

于 2016-08-30T20:29:55.217 回答