禁用DrawerLayout的稀松布触摸手势

时间:2015-07-30 07:51:45

标签: android touch gesture drawerlayout

enter image description here

我需要在平纹棉布上禁用触摸手势(红色突出显示的部分)。我只想用滑动来解开抽屉。

问题是,当抽屉布局打开并且我需要从红色突出显示部分下方的ListView中选择一个元素时,发生的事情是抽屉被关闭,此时我只能从ListView中选择一个元素

我需要直接从ListView中选择元素,也就是在打开抽屉时

3 个答案:

答案 0 :(得分:3)

您必须为此创建自定义抽屉

if (+sessionStorage.reloadedAt > Date.now() - 30000) {
    // Do your checks
}

注意:public class CustomDrawer extends DrawerLayout { public CustomDrawer(Context context) { super(context); } public CustomDrawer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomDrawer(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if(isDrawerOpen(Gravity.START)){ if(event.getX() > getChildAt(1).getWidth()){ return false; } } return super.onInterceptTouchEvent(event); } } 应该是您将重力作为“开始”的孩子,其宽度决定了开口抽屉的宽度。

我希望这可以解决你的问题

答案 1 :(得分:1)

我在这里问了一个问题:
How to vary between child and parent view group touch events

正在触发parentdrawerontouchevent,而不是childlistview

我在这里也回答了类似的问题:

https://stackoverflow.com/a/28180281/3956566

您需要管理您的触摸事件,以便由孩子处理。您需要使用onInterceptTouchEvent并返回false。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    // returning false means the child will handle the touch event.
    return false;
}

然后,您为列表视图管理touchevent

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // This method will only be called if the touch event was intercepted in 
    // onInterceptTouchEvent
    // TODO Select your listview item.

}

您还可以确定正在进行的触摸事件的类型,例如,滚动并确定孩子或父母是否将管理事件。

Managing Touch Events in a ViewGroup

我在这里Understanding Android Input Touch Events System Framework (dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent, OnTouchListener.onTouch)添加了这句话:

  

根视图开始将事件调度到其子项。让我们   假设我们有这种层次结构:

     

A - ViewGroup1(B的父)。
    B - ViewGroup2(C的父)。
    C - 查看(B的孩子)
   - 接收触摸/点按/点击。现在根视图将调用   A.dispatchTouchEvent()。现在是ViewGroup.dispatchEvent()的工作   (而不是View.dispatchEvent())是查找所有子视图和视图   边界包含触摸点坐标的组(使用命中   测试算法)。当它找出相关儿童的清单时,   它开始通过调用它们来调度事件给它们   dispatchTouchEvent()。

     

这是一个重要的部分。在dispatchTouchEvent()之前   呼叫孩子,A.dispatchTouchEvent()将首先调用   A.onInterceptTouchEvent()查看视图组是否感兴趣   拦截事件并自行处理后续手势   (滚动是一个很好的用例,B上的投掷应该导致   滚动A)。 onInterceptTouchEvent()方法仅可用   在视图组(因为他们是可以成为父母/容器的人   拦截触摸事件的要求,可以保持一个   注意事件并通过返回真实来劫持它。如果返回false   然后像往常一样继续调度,即B.dispatchTouchEvent()   (孩子)将被召唤。但是在返回true时,这就是将要发生的事情:

     

ACTION_CANCEL将被派遣给所有的孩子   一切   后续手势事件(直到ACTION_UP / ACTION_CANCEL)将是   由事件监听器(OnTouchListener.onTouch())消耗的if   定义,否则在A级别的事件处理程序A.onTouchEvent()   A.onInterceptTouchEvent()本身永远不会再被调用。

With this diagram:

diagram of touch event propagation

如果您需要更多解释,请告诉我。

答案 2 :(得分:-2)

只需将android:clickable="true"添加到抽屉菜单。