【问题标题】:How to prevent clickevent on Screen when actor is touched ? (LIBGDX)触摸演员时如何防止屏幕上的点击事件? (LIBGDX)
【发布时间】:2019-01-03 16:02:52
【问题描述】:

我有一个:

  • 实现 InputProcessor 的屏幕
  • 在屏幕中创建的舞台。
  • 添加到舞台的演员
  • Actor 有一个带有 touchUp 方法的 InputListener,当 Actor 被触摸时调用该方法。
  • 点击演员时,演员 inputlistener 的 touchUp 方法会被调用,同时 InputProcessor 的 touchUp 也会被调用。

问题: 如何防止从屏幕调用 touchup 方法?我的目标只是处理来自演员的事件。我只想对演员的触摸做出反应,而不是对屏幕做出反应。

【问题讨论】:

  • 按照你描述的方式,演员永远不会得到输入事件。为此,需要您的 State 是 InputProcessor。那么您是如何设置多路复用器的?

标签: libgdx


【解决方案1】:

以下是帮助您更好地理解我的回答的参考资料:

https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputListener.html#touchDown-com.badlogic.gdx.scenes.scene2d.InputEvent-float-float-int-int-

该链接显示了InputListener 类中的一种方法。在您的问题中,您询问了touchUp 方法,该方法也与touchDown 方法有关。

touchDown 方法返回一个布尔值,而 touchUp 是无效的。因此,您不能取消“修饰”事件。但是,您可以通过返回 true 来“取消”“触地”事件。我说“取消”是因为它并没有真正取消它,它只是让实现知道您现在正在处理“touch down”和“touch up”事件。

使用touchDown 方法可能是您的最佳选择。我相信您仍然可以使用touchUp,但如果touchDown 返回true,我不知道其他听众是否收到touchUp 呼叫(鉴于文档,我认为他们不会)。这是你必须自己测试的东西。


现在,如果您确实需要取消“修饰”事件,请执行以下操作:

https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/Event.html#cancel--

您可以尝试取消活动。因为InputListener中的touchUp方法传递了一个InputEvent对象,你可以尝试使用inputEvent.cancel()取消它

【讨论】:

    【解决方案2】:

    如果您将捕获诸如 touchUp、touchDown 等事件。您必须说该事件已处理,否则该事件将运行到下一个 InputListener,直到一个 Listener 说该事件已处理。

    要将事件设置为已处理,您必须在事件对象上调用handle() 方法:

    actor.addListener(new InputListener(){
        @Override
        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
            event.handle();
        }
    });
    

    这里使用 InputMultiplexer 进行了更多描述:Screen responds when button is clicked

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 2020-06-13
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2013-10-04
      相关资源
      最近更新 更多