让我们说
- 我有一个监听“点击”事件的按钮,并指向执行某项操作的功能。
- 我放了一个覆盖按钮的ImageRact。一层了。
当我点击按钮所在区域上方的封面图像时,事件功能STILL会执行。
我该如何避免这种情况?
示例:
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
虽然“cover2”被“封面”图片覆盖,但仍然会执行hidebg()函数。
我知道我可以让按钮isVisible = false并解决问题,但是我在不同层中的不同组中有几十个按钮,我想知道如何以智能方式完成它。也许以某种方式禁用整个组?我不知道。
答案 0 :(得分:6)
您可以通过两种方式在项目中禁用该按钮。
1)只需创建一个cover
的监听器,如下所示return true
,如下所示:
function coverPressed()
return true;
end
cover:addEventListener("tap",coverPressed)
2)检查cover
是否存在,然后删除logo2
的监听器:
logo2:removeEventListener("tap", hidebg)
保持编码............
答案 1 :(得分:0)
这个问题可以通过添加一个触摸事件监听器来解决,该监听器将true
返回到屏蔽DisplayObject,如accepted answer所示,是处理或停止触摸的传播。在由屏蔽对象处理之后,触摸将永远不会到达位于显示层级中更下方的按钮上的监听器(或者如果您愿意,可以进一步返回)。
Corona SDK documentation on tap/touch propagation:
中对此进行了解释当用户触摸屏幕时,事件将被分派到显示层次结构。只有那些与屏幕上的触摸位置相交的显示对象才会收到该事件。
点击并触摸按特定顺序通过这些对象传播的事件。默认情况下,接收事件的第一个对象是显示层次结构中与触摸位置相交的最前面的显示对象。接收事件的下一个对象是层次结构中与触摸位置相交的下一个对象,依此类推。
点击并触摸传播的事件,直到它们被“处理”。这意味着,如果在显示层次结构中有多个对象相互重叠,并且每个对象都应用了tap或touch事件侦听器,则事件将传播通过所有这些对象。但是,您可以通过告知Corona已处理事件来停止传播到下一个基础对象。这非常简单,就像从事件监听器返回true [emphasis mine]一样简单 - 这会停止传播周期并阻止任何底层对象响应命中事件。
如果您的button
来自widget.*
库,则可以通过禁用它并使其不可见来更简单地获得相同的结果:
button:setEnabled( false )
button.isVisible = false
顺便说一句,使用isVisible
(而不是更改alpha
)的好处是您不需要在隐藏按钮之前跟踪alpha值。如果您稍后执行button.isVisible = true
,则ButtonWidget将具有与之前相同的alpha值。