如何在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()函数。
控制触摸事件传播
解决这个问题的方法是为遮罩 DisplayObject 添加一个返回真值的触摸事件监听器,就像接受的答案所建议的一样,这样可以处理或停止触摸事件的传播。一旦被遮罩对象所处理,触摸事件将永远不会到达显示层级中进一步低的按钮监听器(或者您可以选择更低一层)。
这在Corona SDK 的点击/触摸传播文档中有所解释:
当用户触摸屏幕时,事件会分派到显示层级。只有与屏幕触摸位置相交的那些显示对象才会接收该事件。
点击和触摸事件按一定顺序在这些对象上传播。默认情况下,接收事件的第一个对象是最上层的显示对象,它与触摸位置相交。接收事件的下一个对象是在层次结构中紧随其后的与触摸位置相交的对象,以此类推。
点击和触摸事件会一直传播,直到它们被“处理”。这意味着如果你在显示层级中有重叠的多个对象,并且每个对象都有一个点击或触摸事件监听器,事件将通过所有这些对象传播。然而,您可以通过告诉 Corona 事件已经被处理来停止传播到下一层的对象。这是“很简单的”,只需从事件监听器中返回真值即可[重点标记为我],这会停止传播循环并防止任何底层对象对点击事件作出响应。
更改小部件属性
如果您的 button 是来自 widget.* 库,您可以更简单地通过将其禁用并使其不可见来实现相同的结果:
button:setEnabled( false )
button.isVisible = false
顺便说一下,使用 isVisible(而不是改变 alpha)的优点是您不需要在隐藏按钮之前跟踪 alpha 值。如果您稍后执行 button.isVisible = true,ButtonWidget 将具有与之前相同的 alpha 值。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
以下是保留原本 markdown 格式的中文翻译:
有两种方法可以在你的项目中禁用该按钮。
1) 只需创建一个侦听器来监听
cover,如下所示,并return true:function coverPressed() return true; end cover:addEventListener("tap",coverPressed)2) 检查
cover是否存在,然后移除logo2的侦听器:logo2:removeEventListener("tap", hidebg)继续编码......