14

我需要禁用滑动以打开/关闭 SlidingPaneLayout,因为我的主视图是地图。我将使用按钮打开/关闭它。

4

6 回答 6

17

子类化SlidingPaneLayout,覆盖onInterceptTouchEvent()并使其始终返回false。这将阻止SlidingPaneLayout处理触摸事件。

有关详细信息,请参阅http://developer.android.com/training/gestures/viewgroup.html

更新
如果子视图没有处理触摸事件,仍然会调用SlidingPaneLayout'方法。onTouchEvent()要完全禁用处理触摸事件,还要覆盖onTouchEvent()并始终返回false

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    return false;
}

注意:这种方法的缺点是,当第二个子视图仅部分可见时,触摸事件仍会被分派到第二个子视图。因此,您可能想查看其他答案。

于 2013-06-09T01:14:32.347 回答
10

这个有点棘手。如果您始终返回 true,onInterceptTouchEvent()它将向下面的隐藏内容发送事件。我能够像这样实现它:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return !slidingEnabled || super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (!slidingEnabled) {
        // Careful here, view might be null
        getChildAt(1).dispatchTouchEvent(ev);
        return true;
    }
    return super.onTouchEvent(ev);
}
于 2013-08-11T21:31:22.213 回答
5

如果您想禁用“拖动打开”事件并在打开布局后启用用户输入,您可以使用这个

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {

    if(!isOpen()) return false;

    return super.onInterceptTouchEvent(arg0);
}  
于 2015-06-14T07:09:37.970 回答
1

以 Roman Zhilichs 的回答为基础,进行了两项改进。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return !swipeEnabled || super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (!swipeEnabled) {
        if (!getChildAt(0).dispatchTouchEvent(ev)) {
            ev.offsetLocation(-getChildAt(0).getWidth(),0);
            getChildAt(1).dispatchTouchEvent(ev);
        }
        return true;
    }
    return super.onTouchEvent(ev);
}

首先,这会尝试将 MotionEvent 分派给第一个孩子,然后再分派给第二个孩子。这样,两个子视图都保持交互。其次,调度到第二个子视图的 MotionsEvents 必须偏移第一个视图的宽度。这假设滑动窗格从左侧滑入,就像 SlidingPaneLayout 一样。

于 2014-10-09T13:49:45.400 回答
0

如果设置 touchlistener 并返回 true,它将消耗触摸事件,并且小部件不会进一步处理它。

slidingPaneLayout.setOnTouchListener(new View.OnTouchListener() { 
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return true;
    }
});
于 2016-11-07T19:02:55.270 回答
0

我知道这个线程很旧,但如果有人想在不覆盖任何内容的情况下解决这个问题,您只需要将布局菜单的宽度设置layoutParams为零。

binding.clMenu.layoutParams.width = 0clMenu声明的第一个布局在哪里SlidingPaneLayout

于 2021-02-26T13:12:45.090 回答