【问题标题】:Touch Listeners for overlapping Views重叠视图的触摸监听器
【发布时间】:2013-03-20 09:35:58
【问题描述】:

我想知道是否有可能让 View 彼此叠放并为它们分开监听器。具体来说,我有两个完全重叠且尺寸完全相同的视图,我正在尝试为 view_one 实现一个运动事件 OnTouchListener,为 view_two 实现一个 OnLongPressListener。但是,view_one 上的 OnTouchListener 似乎阻止了 view_one 的 OnLongClickListener。

代码的基本目标是让多个触摸交互做不同的事情:

  1. 短按做一件事
  2. 长按另一个
  3. 垂直方向的触摸拖动和释放会做另一件事
  4. 在另一个水平方向上触摸拖动

等等,尽可能多的不同的东西。

也许我应该只有一个用于触摸而不是两个的视图,并且有一种方法可以将触摸和运动事件分开。我知道如何区分短按和长按事件,但运动事件会搞砸。

我确信有更好的方法来做到这一点。非常感谢任何提示或建议。有没有办法限制滑动动作的长度和触摸持续时间,以帮助确定要采取的行动?

【问题讨论】:

  • 感谢您的编辑,我是新手,所以下次我会更多地处理格式问题。这样的 cmets 是否被视为离题且不允许?
  • 如果两个视图的尺寸相同,为什么需要检测两个视图的触摸,而不是仅消耗顶视图上的触摸。长按视图 1 与长按视图 2 相同,如果它们具有完全相同的尺寸和位置...
  • 是的,我认为你是对的......我只是把这一切都搞错了。 kyle 下面的解决方案解决了我的问题。

标签: android view touch motion


【解决方案1】:

回答您问题的第一部分 - 如果触摸侦听器在到达 view_two(下方视图)之前正在使用该事件,这可能是因为您正在使用 onTouchListener 中的触摸事件。

//Returns true if the listener has consumed the event, false otherwise.
public abstract boolean onTouch (View v, MotionEvent event)

你在这个方法中总是返回 false 吗?如果不是,则有些事件可能不会传播到层次结构中的下一个视图。

至于您的第二个问题 - 是的,您当然可以创建一个 onTouchListener 来处理所有这些事件。这是一个短按和长按的示例(与移动量无关):

private MotionEvent downEvent;

public abstract boolean onTouch (View v, MotionEvent event){
    if (downEvent == null && event.getAction == MotionEvent.ACTION_DOWN){
        downEvent = event;
        return false;
    }


    if (event.getAction == MotionEvent.ACTION_UP){
        if (event.getDownTime() > LONG_PRESS_THRESHOLD){
            ... do something ...
        } else if (event.getDownTime() > SHORT_PRESS_THRESHOLD){
            ... do something else ...
        } 
    }
}

正如您可以想象的那样,确定您的向下事件和当前事件之间的 delta X / delta Y 是否满足您为事件 3 和 4 确定的阈值只需要更多的努力。

【讨论】:

  • 好吧,这很有意义。通过更多的谷歌搜索和大量的工作,我能够实现这一点。谢谢!!!我认为上面有几个错别字:getAction()。我必须添加括号才能使其正常工作。此外,getDownTime() 给我带来了一些麻烦,因为它给了系统启动事件发生的时间,所以我必须实现一个 getEventTime() 来获取发生事件的时间,然后将差值与任何阈值进行比较次我声明。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多