1

比方说

-我有一个按钮,可以监听“点击”事件,并指向一个执行某些操作的函数。

- 我放了一个覆盖按钮的 ImageRact。上一层。

当我单击按钮所在区域正上方的封面图像时,事件函数仍然执行。

我该如何避免这种情况?

例子:

local function hidebg()

    display.remove(logo3)
    logo3=nil
end

local logo2= display.newImage("logo.png")
logo2.x=display.contentCenterX
logo2.y=280
logo2.width=200
logo2.height=74
logo2:addEventListener("tap", hidebg)

local cover =display.newImageRect("NEW GAME A.png", 480,320)
cover.x=display.contentCenterX/2
cover.y=display.contentCenterY/2

尽管 "logo2" 被 "cover" 图像覆盖,但 hidebg() 函数仍在执行。

我知道我可以使按钮 isVisible=false 并解决问题,但是我在不同层的不同组中有几十个按钮,我想知道如何以聪明的方式做到这一点。也许以某种方式禁用整个组?我不知道。

4

2 回答 2

6

有两种方法可以在项目中禁用该按钮。

1)只需创建一个如下的侦听器,cover如下return true所示:

function coverPressed()
    return true;
end
cover:addEventListener("tap",coverPressed)

2)检查是否cover存在,然后去掉as的监听器logo2

logo2:removeEventListener("tap", hidebg)

继续编码…………

于 2013-08-26T06:26:08.557 回答
0

控制触摸传播

如已接受的答案中所建议的,可以通过添加一个返回true到掩蔽 DisplayObject的触摸事件侦听器来解决此问题的原因是,它可以处理或停止触摸的传播。被遮罩对象处理后,触摸将永远不会到达位于显示层次结构中更靠下(或更靠后,如果您愿意)的按钮上的侦听器。

这在有关点击/触摸传播的 Corona SDK 文档中进行了解释:

当用户触摸屏幕时,该事件被分派到显示层次结构。只有那些与屏幕上的触摸位置相交的显示对象才会收到该事件。

点击和触摸事件以特定顺序通过这些对象传播。默认情况下,接收事件的第一个对象是显示层次结构中与触摸位置相交的最前面的显示对象。接收事件的下一个对象是层次结构中与触摸位置相交的下一个对象,依此类推。

点击和触摸事件传播,直到它们被“处理”。这意味着如果您在显示层次结构中有多个相互重叠的对象,并且每个对象都应用了点击或触摸事件侦听器,则该事件将通过所有这些对象传播。但是,您可以通过告诉 Corona 事件已被处理来停止传播到下一个底层对象。这就像从事件监听器返回 true [emphasis mine] 一样简单——这会停止传播周期并防止任何底层对象响应命中事件。

更改小部件属性

如果您button来自widget.*图书馆,您可以通过禁用它并使其不可见来更简单地获得相同的结果:

button:setEnabled( false )
button.isVisible = false

顺便说一句,使用isVisible(而不是更改alpha)的优点是您不需要在隐藏按钮之前跟踪 alpha 值。如果您稍后这样做button.isVisible = true,ButtonWidget 将具有与以前相同的 alpha 值。

于 2017-04-13T00:32:24.843 回答