cocos quick lua 输入框点击穿透的问题处理方案。

来源:互联网 发布:日本人相互的称呼知乎 编辑:程序博客网 时间:2024/05/14 20:59

cocos quick lua 输入框点击穿透的问题处理方案。
条件:当前版本quick-3.3 -lua,系统 win7。

问题:在输入框(textField或者editbox,下文“输入框”就代表这两种)打开的情况下弹出其他界面盖住输入框,点击上层界面的时候输入框还会优先响应点击事件,而上层的界面上的其他控件不会响应点击事件。

原因分析:界面上的点击事件使我们自己定义的touch事件,而输入框点击事件是在cpp层quick接受处理的,所以导致我们拦截点击事件也不好处理。

处理方案一:更改Cpp层做成统一的事件监听可以按照层级来顺序监听。

处理方案二:脚本层处理,重新封装UIInput对象使得满足事件监听顺序。

由于老大不让我改引擎代码,让我想办法脚本层处理这个问题。于是我从方案2入手的。

已知输入框是可以通过setTouchEnabled函数屏蔽点击事件的,

于是思路如下,UIInput本来返回一个输入框类型的对象,要满足点击顺序必须使用与lua层点击事件一样的事件处理。因此我需要返回一个可以重写touch事件的界面就Node吧,

先对输入框setTouchEnabled函数上锁,然后通过touch事件来处理来决定是否向下传递点击事件,这个时候需要一个输入框点击函数touchDownAction,往下传递点击事件,传递完毕立即加锁。

点击事件代码如下

local oTouchNode = display.newNode()
oTouchNode:setContentSize(oSize)
editbox:addTo(oTouchNode)
editbox:setTouchEnabled(false)    –输入框加锁
oTouchNode:setTouchEnabled(true)

oTouchNode.editBox = editbox–本来是要返回editbox对象的,现在返回的是oTouchNode

oTouchNode:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
if “ended” == event.name then

  –这里可以建判断点击事件是否还在控件中
  editbox:setTouchEnabled(true) –解锁
  editbox:touchDownAction(editbox, 2)–传递事件
  editbox:setTouchEnabled(false) –加锁
  end
  return true
end)

return oTouchNode

**这样会导致一个小问题是我们不能直接访问editbox的方法,为了兼容其他已经写到的地方我们可以把editbox的函数重定向到Node上

这里写图片描述

当然要搜一下 用到了哪些都加上才行。

就这么多吧,测试可行。第一种方案需引擎优化吧。

原创粉丝点击