点击交互的四种处理
来源:互联网 发布:淘宝怎么换店铺头像 编辑:程序博客网 时间:2024/05/21 02:36
1、函数回调
// a selector callbackvoid menuCloseCallback(Object* pSender);auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));void HelloWorld::menuCloseCallback(Object* pSender){ Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0);#endif}
其中CC_CALLBACK_1宏是将函数与对象绑定在一起,1表示这个函数有一个参数。当点击这个按钮时,会调用这个回调函数。
除了基于c++11的这个形式的改变,使用方法与先前相同。
2、Layer的touch消息响应
虽然重写了底层的dispatch,但对这层的使用影响并不大。我们同样需要重写:
//单点响应virtual bool onTouchBegan(Touch* touch, Event *event) override;virtual void onTouchMoved(Touch* touch, Event *event) override;virtual void onTouchEnded(Touch* touch, Event *event) override;virtual void onTouchCancelled(Touch *touch, Event *event) override;//多点响应virtual bool onTouchesBegan(Touch* touch, Event *event) override;virtual void onTouchesMoved(Touch* touch, Event *event) override;virtual void onTouchesEnded(Touch* touch, Event *event) override;virtual void onTouchesCancelled(Touch *touch, Event *event) override;
重写这些函数来对layer的点击做处理。当然,我们需要:
setTouchEnabled(true)。
此外有个小改动。对于单点触控响应,可以调用:
//设置为单点响应setTouchMode(Touch::DispatchMode::ONE_BY_ONE);//设置为多点响应(默认)setTouchMode(Touch::DispatchMode::ALL_AT_ONCE);
进行设置,而不需要再用设置Delegate的方式来做了。
3、TouchEvent响应
//声明void touchButton(Object* object,TouchEventType type);//挂接到控件上uiButton->addTouchEventListener(this,toucheventselector(HelloWorld::touchButton));//实现void HelloWorld::touchButton(Object* object,TouchEventType type){LabelTTF* label;switch (type){case TouchEventType::TOUCH_EVENT_BEGAN:label = static_cast<LabelTTF*>(getChildByTag(11));label->setString("按下按钮");break;case TouchEventType::TOUCH_EVENT_MOVED:label = static_cast<LabelTTF*>(getChildByTag(11));label->setString("按下按钮移动");break;case TouchEventType::TOUCH_EVENT_ENDED:label = static_cast<LabelTTF*>(getChildByTag(11));label->setString("放开按钮");break;case TouchEventType::TOUCH_EVENT_CANCELED:label = static_cast<LabelTTF*>(getChildByTag(11));label->setString("取消点击");break;default:break;}}
因为所有的UIWidget都要添加到UILayer上,而UILayer通常都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。因为UILayer也会有层级的改变,比如它和MenuItem之间的关系。所以说“基本上”。
4、Listener消息响应方式
这种实现也是新加入的。它更像是点击的一个层次过滤器。点击时,在listener队里中进行过滤。每一个listener检查自己保存的touch消息响应是否会被触发。一层一层过滤,最后在到Layer的touch消息响应。
我觉得它的设计的初衷是为任意sprite提供一套自己制定的点击响应。但这样的实现仍然要写很多条件判断,没有能够控件化。可能我的理解有些偏差,欢迎讨论。
具体的用法大致是这样:
auto dispatcher = EventDispatcher::getInstance();auto myListener = EventListenerTouch::create(Touch::DispatchMode::ONE_BY_ONE);//如果不加入此句消息依旧会向下传递myListener->setSwallowTouches(true);myListener->onTouchBegan = [=](Touch* touch,Event* event){<span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word;"></span>//some check <span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word;"></span> if (pass) <span style="margin: 0px; padding: 0px; list-style: none outside none; word-break: normal; word-wrap: break-word;"></span>{ return true; } return false;};myListener->onTouchMoved = [=](Touch* touch,Event* event){//do something};myListener->onTouchEnded = [=](Touch* touch,Event* event){//do something};dispatcher->addEventListenerWithSceneGraphPriority(myListener,mySprite1);dispatcher->addEventListenerWithSceneGraphPriority(myListener,mySprite2);
其原理是在dispatcher中检查listener列表,例如myListener或加进来的其他listener。然后每个listener检查自己中的Item看能否达到检查条件,例如:mySprite1,mySprite2。然后执行相应的操作。但这样的话,当控件很多的时候,每一次事件都进行这种双链表的检查操作不知会不会影响些性能?
- 点击交互的四种处理
- 点击交互的四种处理
- Cocos2d-x 开发 点击交互的四种处理
- Cocos2d-x 3.0开发 点击交互的四种处理
- Cocos2d-x 3.0开发(三)点击交互的四种处理
- Cocos2d-x 3.0开发(三)点击交互的四种处理
- Cocos2d-x 3.0开发(三)点击交互的四种处理
- ocos2d-x 3.0开发(三)点击交互的四种处理
- Cocos2d-x 3.0开发(三)点击交互的四种处理
- 关于cocos2d-x 3.0的点击交互处理
- 简单的点击交互
- Androidx学习笔记(4)-- 事件处理的四种写法(点击事件为例)
- cocos2dx 3.0 研究(6)点击交互的处理注意事项及范例
- Android点击事件的四种写法
- android点击事件的四种写法
- 点击事件的四种写法
- Android模拟点击的四种方式
- Android的四种点击事件
- 反调试技术
- Ubuntu : 解决更新时出现 Unable to locate package update(
- HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看
- HTML转码码
- Python爬虫抓取
- 点击交互的四种处理
- FatMouse's Speed(HDU 1160)—— DP记录路径
- 查看锁的几个视图
- 怎样从JSP页面传参数到<jsp:useBean>标签
- Ioc--控制反转详解
- 【DataStructure】Implemantation of Binary Tree
- 《TCP/IP详解卷2:实现》笔记--IGMP:Internet组管理协议
- 常见HTTP状态码
- 使用JSON数据向服务器提交和获取服务器传递的Json数据