您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 3.x 关于cocostudio的UI将事件吃掉,场景Layer无法响应手势的问题解决方法

2014-08-02 20:21 731 查看
cocostudio的UI编辑器真是个好东西,用的熟真是可以节省很多开发时间,把客户端程序员从无尽的需求变化中解脱出来~

最近使用cocostudio的UI编辑器,遇到了一个问题,就是希望在场景当中注册Touch事件实现手势功能的同时,还能够使用cocostudio的UI编辑器导出的Layout等界面,

之前在做UI的过程当中,其实有一个属性很关键,就是那个标有“交互”属性的checkbox,打钩,不打钩,这个看似不重要,其实这就是今天我写这篇文章的”金钥匙“!

我的UI一般是做成全屏的,这样比较方便

场景中注册了onTouchBegan等事件后,自从添加了Layout的UI后,就再也无法响应场景的onTouchBegan了,很奇怪,最后看到了一篇文章:

传送门:
http://www.cocoachina.com/bbs/read.php?tid=197606
嘿嘿,自从把所有”交互“全部取消(除了按钮)以后,就正常了,场景的事件又可以响应了。

那这个”交互“选项内部,到底隐藏着怎样的秘密呢?

Layout* ui = xxxx;

ui->setTouchEnabled(true);

其实”交互“就是设置的是TouchEnabled()这个函数,如果为false,这个Layout就不会注册TouchListener,

事件向下传递,主要看的是onTouchBegan函数,是否返回false,如果返回true,则会被截断,这样后面的Widget或者Layer就无法接受事件了。

因此,如果一个UI打开了这个setTouchEnabled(true); 它的 onTouchBegan 就会返回true,把这个事件吃掉

具体原理,可以参看CCEventDispatcher.cpp

void EventDispatcher::dispatchTouchEvent(EventTouch* event)

{

}

其中有一段代码:

if (isClaimed && listener->_isRegistered && listener->_needSwallow)
{
if (isNeedsMutableSet)
{
mutableTouchesIter = mutableTouches.erase(mutableTouchesIter);
isSwallowed = true;
}
return true;
}
这个 isClaimed变量其实就是onTouchBegan的返回值,该单词意思为认领,一旦这个Touch事件被某个接受者认领以后,就会在mutableTouches中将其删除,因此就不会继续传递下去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐