cocos实现触摸屏幕关掉界面

来源:互联网 发布:编程培训加盟 编辑:程序博客网 时间:2024/05/29 03:04

最近要求人物信息界面不通过点击按钮关闭,而是点击屏幕任意位置关闭。
实现方法就是给界面添加触摸事件。

要是想实现点击所有位置都关掉界面,可以在界面的最上层盖上一层layer来响应事件。
要是想实现点击对话框以外的部分来关掉界面,可以在对话框的下面添加一层layer来响应,再让对话框的控件吞噬掉触摸,对话框本身就不会响应事件了。例子如下:

void XXX::createUI(){    //最底层的一层layer,用于响应触摸事件    m_pTouchLayer = dynamic_cast<Layout*>(shareLoader->getChildByName("Panel_3"));    //创建一个点击事件    m_pTouchListener = EventListenerTouchOneByOne::create();    m_pTouchListener->setSwallowTouches(false);//阻止触摸向下传递    m_pTouchListener->onTouchBegan = [&](Touch* touch, Event* event)    {        return true;    };    m_pTouchListener->onTouchEnded = CC_CALLBACK_2(MJUserHeadUI::onTouchEnded, this);    //给layer绑定事件    _eventDispatcher->addEventListenerWithSceneGraphPriority(m_pTouchListener, m_pTouchLayer);}///////////////////////////////////////void XXXXX::onTouchEnded(Touch* touch, Event *event){    this->removeFromParent();}

代码很简单,但是写的时候却因为不动脑子,耽误了点时间。
因为之前写聊天界面的时候,也是通过触摸事件来,点击聊天按钮界面弹出,点击空白屏幕界面消失。那个时候,逻辑是直接写在onTouchBegan 里面的,如下:

m_pTouchListener->onTouchBegan = [&](Touch* touch, Event* event)    {        if (this->isShowing() == true)        {            this->hideUI();        }        return true;    };

然后。。。在写这个的时候,却不是setvisible的方式,而是removeFromParent的方式,直接写在onTouchBegan 里面就会有问题。

//class CC_DLL EventListenerTouchOneByOne : public EventListenertypedef std::function<bool(Touch*, Event*)> ccTouchBeganCallback;typedef std::function<void(Touch*, Event*)> ccTouchCallback;ccTouchBeganCallback onTouchBegan;ccTouchCallback onTouchMoved;ccTouchCallback onTouchEnded;ccTouchCallback onTouchCancelled;

看源代码,began是有返回值的,会根据返回的true和false来进行下面的逻辑。在返回之前就removeFromParent,会造成layer的触摸吞噬失效,在表现上就是,关闭界面的同时,会触发下面一层的按钮事件。但是,具体在cocos哪个地方造成这个现象,我就没花时间跟进了。因为这个地方,不管怎么写触摸和吞噬都能触发下面layer的控件,我还以为是绑定触摸事件这步有问题,跟了很久代码。。。所以,把removeFromParent写在onTouchEnded里面就好了。

写代码的时候真的要走点心,我虽然只是个拼UI的,也希望是拼得最快最美最熟练的。。。