1

通常按下 的内容区域时DrawerLayout,抽屉将关闭并消耗触摸。有没有办法防止这种情况并将触摸事件传递到内容区域?

谢谢!

4

2 回答 2

6

我最终修改了 DrawerLayout。

在该方法onInterceptTouchEvent(MotionEvent ev)中,您必须防止interceptForTap被设置为 true。一种方法是删除以下条件。

if (mScrimOpacity > 0 &&
    isContentView(mLeftDragger.findTopChildUnder((int) x, (int) y))) {
    interceptForTap = true;
}

这将允许触摸“失败”。

要让抽屉不关闭,您可以将抽屉锁定模式设置为LOCK_MODE_LOCKED_OPEN

于 2013-09-06T04:14:05.000 回答
2

guy_m给出的答案的启发,我修改了他的建议并建议对 DrawerLayout 进行以下扩展。同样,此解决方案是通过覆盖 onInterceptTouchEvent()。

覆盖方法的逻辑相当简单:

  • 每当抽屉视图(DrawerLayout 的可滑动部分)发生触摸事件时,我们返回 false。这意味着 DrawerLayout 既不拦截也不关心该手势以及该手势的任何其他触摸事件,并且任何此类事件都由 DrawerLayout 的子视图处理。
  • 另一方面,当抽屉视图中发生事件时,我们调用 super.onInterceptTouchEvent() 并让此方法决定是否应该拦截事件和/或应该如何处理它。只要滑动/触摸手势发生抽屉视图上,这让我们可以像原来的 DrawerLayout 一样将抽屉滑入和滑出。

下面的重写 onInterceptTouchEvent() 方法的示例适用于 DrawerLayout,其抽屉视图位于屏幕右侧 (android:gravity="right")。然而,如何调整代码以适用于标准的左侧抽屉视图应该是显而易见的。

public class CustomDrawerLayout extends DrawerLayout
{

    @Override
    public boolean onInterceptTouchEvent( MotionEvent event )
    {
        final View drawerView = getChildAt( 1 );
        final ViewConfiguration config = ViewConfiguration.get( getContext() );

        // Calculate the area on the right border of the screen on which
        // the DrawerLayout should always intercept touch events.
        // In case the drawer is closed, we still want the DrawerLayout
        // to respond to touch/drag gestures there and reopen the drawer!
        final int rightBoundary = getWidth() - 2 * config.getScaledTouchSlop();

        // If the drawer is opened and the event happened
        // on its surface, or if the event happened on the
        // right border of the layout, then we let DrawerLayout
        // decide if it wants to intercept (and properly handle)
        // the event.
        // Otherwise we don't let DrawerLayout to intercept,
        // letting its child views handle the event.
        return ( isDrawerOpen( drawerView ) && drawerView.getLeft() <= event.getX()
                || rightBoundary <= event.getX() )
                && super.onInterceptTouchEvent( event );
    }
...
}
于 2017-10-07T16:02:35.763 回答