cocos2dx 3.3 cocos studio的交互性问题
2016-04-29 15:19
966 查看
最近在使用cocos studio的时候,发现里面有个选项:交互性,一直没有很明白具体是啥意思。通常这种时候,看源码就对了。
勾选 交互性 的时候,对应的ccs文件里,会多一个属性 TouchEnable="True"
于是,第一步就完成了,这个 交互性,应该就是指控件是否支持触摸操作。
找到源码,cocos-->ui-->UIWidget-->Widget类-->setTouchEnable
然后看onTouchBegan
小结一下:
交互性勾选是,默认吞噬触摸,如果点击在控件区域内,则处理后续事件,在区域外,则不处理。
click事件在up时触发。
如果希望事件往下层传播,那就在代码里找到对应的控件,调用setSwallowTouches(false)
交互性
新建了个cocos studio工程,然后在上面加了个控件,做测试。勾选 交互性 的时候,对应的ccs文件里,会多一个属性 TouchEnable="True"
于是,第一步就完成了,这个 交互性,应该就是指控件是否支持触摸操作。
源码
知道了 交互性 的意义之后,就是看实现了。找到源码,cocos-->ui-->UIWidget-->Widget类-->setTouchEnable
void Widget::setTouchEnabled(bool enable) { if (enable == _touchEnabled) { return; } _touchEnabled = enable; if (_touchEnabled) { _touchListener = EventListenerTouchOneByOne::create(); CC_SAFE_RETAIN(_touchListener); // 默认吞噬触摸,可以调用setSwallowTouches接口取消吞噬 _touchListener->setSwallowTouches(true); // 触摸事件处理 _touchListener->onTouchBegan = CC_CALLBACK_2(Widget::onTouchBegan, this); _touchListener->onTouchMoved = CC_CALLBACK_2(Widget::onTouchMoved, this); _touchListener->onTouchEnded = CC_CALLBACK_2(Widget::onTouchEnded, this); _touchListener->onTouchCancelled = CC_CALLBACK_2(Widget::onTouchCancelled, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(_touchListener, this); } else { _eventDispatcher->removeEventListener(_touchListener); CC_SAFE_RELEASE_NULL(_touchListener); } }
然后看onTouchBegan
bool Widget::onTouchBegan(Touch *touch, Event *unusedEvent) { _hitted = false; if (isVisible() && isEnabled() && isAncestorsEnabled() && isAncestorsVisible(this) ) { _touchBeganPosition = touch->getLocation(); if(hitTest(_touchBeganPosition) && isClippingParentContainsPoint(_touchBeganPosition)) { _hitted = true; } } if (!_hitted) { return false; // 点击不在区域内,返回false,后续处理也不管 } setHighlighted(true); if (_propagateTouchEvents) { this->propagateTouchEvent(TouchEventType::BEGAN, this, touch); } pushDownEvent(); return true; // 点击在区域内,返回true,后续处理 }再看releaseUpEvent
void Widget::releaseUpEvent() { this->retain(); if (_touchEventCallback) { _touchEventCallback(this, TouchEventType::ENDED); // 触摸事件 } if (_touchEventListener && _touchEventSelector) { (_touchEventListener->*_touchEventSelector)(this,TOUCH_EVENT_ENDED); } if (_clickEventListener) { _clickEventListener(this); // click事件 } this->release(); }
小结一下:
交互性勾选是,默认吞噬触摸,如果点击在控件区域内,则处理后续事件,在区域外,则不处理。
click事件在up时触发。
总结
如果希望控件处理触摸、点击事件,就需要勾选 交互性如果希望事件往下层传播,那就在代码里找到对应的控件,调用setSwallowTouches(false)
相关文章推荐
- 容器
- cocos2dx shader实现灰度图android后台切换回来导致图像偏移的问题
- cocos2d-x xml parse
- cocos2d移植安卓时 修改是否为横 竖
- cocos2d之z轴位置示例
- CocosPod常见错误
- 腾讯Bugly cocos c++配置
- 内存管理
- cocos2d-x lua开发笔记:ListView加载多个item优化处理
- cocos2d-x调用scheduleUpdate()不执行update()方法的解决办法
- cocos2d-js webview
- cocos2d-x 特效(网格动作)
- Cocos2d-x 面试题解 整理01
- cocos2d-x知识总结
- cocos2dx面试题整理
- 跑偏程序员自学cocos2d-x之三 场景切换
- cocos2dx 3.10 黄金矿工学习笔记
- 清爽的 cocos 对象 双击 逻辑
- Cocos2dx 代码命名风格
- 游戏基本概念