如何在Corona中禁用隐藏按钮?

假设我有一个监听“tap”事件的按钮,并指向执行某些操作的函数。我放置了一个ImageRact覆盖在按钮上面的一个图层。当我点击覆盖在该按钮背后的区域上方的覆盖图像时,仍会执行事件函数。我该如何避免这种情况?我知道可以将按钮的isVisible设置为false来解决问题,但我有数十个不同组和不同图层中的按钮,想知道如何以聪明的方式解决。也许以某种方式禁用整个组?我不知道。

示例:

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()函数。

点赞
用户1979583
用户1979583

以下是保留原本 markdown 格式的中文翻译:

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

1) 只需创建一个侦听器来监听 cover,如下所示,并 return true

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

2) 检查 cover 是否存在,然后移除 logo2 的侦听器:

logo2:removeEventListener("tap", hidebg)

继续编码......

2013-08-26 06:26:08
用户3455883
用户3455883

控制触摸事件传播

解决这个问题的方法是为遮罩 DisplayObject 添加一个返回真值的触摸事件监听器,就像接受的答案所建议的一样,这样可以处理或停止触摸事件的传播。一旦被遮罩对象所处理,触摸事件将永远不会到达显示层级中进一步低的按钮监听器(或者您可以选择更低一层)。

这在Corona SDK 的点击/触摸传播文档中有所解释:

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

点击和触摸事件按一定顺序在这些对象上传播。默认情况下,接收事件的第一个对象是最上层的显示对象,它与触摸位置相交。接收事件的下一个对象是在层次结构中紧随其后的与触摸位置相交的对象,以此类推。

点击和触摸事件会一直传播,直到它们被“处理”。这意味着如果你在显示层级中有重叠的多个对象,并且每个对象都有一个点击或触摸事件监听器,事件将通过所有这些对象传播。然而,您可以通过告诉 Corona 事件已经被处理来停止传播到下一层的对象。这是“很简单的”,只需从事件监听器中返回真值即可[重点标记为我],这会停止传播循环并防止任何底层对象对点击事件作出响应。

更改小部件属性

如果您的 button 是来自 widget.* 库,您可以更简单地通过将其禁用并使其不可见来实现相同的结果:

button:setEnabled( false )
button.isVisible = false

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

2017-04-13 00:32:24