3.x的触摸响应机制
第一种是采用函数回调,主要是用于MenuItem
- // a selector callback
- void 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
- }
从上面的代码也可以看得到3.0的一些改变
用CC_CALLBACK_x代替了 按钮的 menu_selector(),update的 schedule_selector 回调接口,其中最后一个x代表着回调函数的参数有几个,0表示0个,1表示1个,2表示2个,上面的例子是1个参数,所以用CC_CALLBACK_1
第二种方法我也不是很明白,TouchEvent响应
这是新加入的响应方式。它主要是使用在UIWidget上的。可以将其看做是函数回调的一个扩展,为更多的响应处理提供可能。使用方法大致是:
- //声明
- 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(getChildByTag(11));
- label->setString("按下按钮");
- break;
- case TouchEventType::TOUCH_EVENT_MOVED:
- label = static_cast(getChildByTag(11));
- label->setString("按下按钮移动");
- break;
- case TouchEventType::TOUCH_EVENT_ENDED:
- label = static_cast(getChildByTag(11));
- label->setString("放开按钮");
- break;
- case TouchEventType::TOUCH_EVENT_CANCELED:
- label = static_cast(getChildByTag(11));
- label->setString("取消点击");
- break;
- default:
- break;
- }
- }
因为所有的UIWidget都要添加到UILayer上,而UILayer通常都会在最上层,所以可以“基本上”认为这种使用方式会优先于其他方式处理点击消息。因为UILayer也会有层级的改变,比如它和MenuItem之间的关系。所以说“基本上”。
第三种 触摸监听绑定
我觉得这种方法相当方便,不仅可以绑定在精灵上,还可以绑定在层上,触摸函数也可以用lambda来写。下面是方法
- auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听
- listener1->setSwallowTouches(true);//设置是否想下传递触摸
- Rect rect = Rect(qipanPoint.x,qipanPoint.y
- ,qipanSize.width,qipanSize.height);
- //3.0 后可以直接在touchBegan后添加它的实现代码,而不用特意去写一个touchBegan的函数
- listener1->onTouchBegan = [rect,this](Touch* touch, Event* event){ //[]中间的是传入的参数
- auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标
- Point locationInNode = target->convertToNodeSpace(touch->getLocation());
- Size s = target->getContentSize();
- if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
- {"white-space:pre"> //以下是我自定义的一些操作
- //创建锁定精灵
- auto lockSprite = Sprite::create("lock.png");
- lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
- lockSprite->setTag(99);
- this->addChild(lockSprite);
- return true;
- }else
- return false;
- };
- //拖动精灵移动
- listener1->onTouchMoved = [rect,this](Touch* touch, Event* event){
- auto target = static_cast(event->getCurrentTarget());//获取的当前触摸的目标
- Point locationInNode = target->convertToNodeSpace(touch->getLocation());
- Size s = target->getContentSize();
- if (rect.containsPoint(locationInNode))//判断触摸点是否在目标的范围内
- {
- //锁定精灵移动
- Sprite *lockSprite = (Sprite*)this->getChildByTag(99);
- lockSprite->setPosition(GetQiziPoint(locationInNode,rect));
- }
- };
- listener1->onTouchEnded = [=](Touch* touch, Event* event){ // =在c++11里面代表这个lambda表达式中能使用外面的变量
- this->removeChildByTag(99);//移除锁定精灵
- };
- //将触摸监听添加到eventDispacher中去
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,layer);
- auto listener = EventListenerTouchOneByOne::create();//创建一个触摸监听(单点触摸)
- listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);//指定触摸的回调函数
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,listen_layer);//将listener和layer绑定,放入事件委托中
- bool HelloWorld::onTouchBegan(Touch* touch, Event *event)
- {
- auto point = Director::getInstance()->convertToGL(touch->getLocationInView());//获得当前触摸的坐标
- auto rect = Rect(160-30,400-30,60,60);//设置框坐标和大小处于close 按钮的位置上
- if(rect.containsPoint(point))//如果触点处于rect中
- {
- auto menu = (Menu*)this->getChildByTag(99);//通过tag获取到menu
- auto item = (MenuItem*)menu->getChildByTag(99);//通过tag从menu中获取item
- item->activate();//让item响应
- }
- return true;//返回true表示接收触摸事件
- }
3.x的触摸响应机制的更多相关文章
- 08 (OC)* 事件的传递和响应机制
前言:苹果的官方文档<Event Handling Guide for iOS>对事件处理做了非常详尽清晰的解释,建议大家仔细研读 1. iOS中的事件介绍 2. 事件的产生和传递 3. ...
- MFC消息响应机制 q
MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...
- React-native 中的触摸响应功能
我们在做APP的时候,与桌面应用系统不同的是触摸响应. web页面对触摸响应的支持和原生的APP有着很大的差异. 基本用法 componentWillMount: function() { this. ...
- Mfc资源消息的响应机制
Mfc消息的响应机制 Mfc中有很多资源,如图标资源,菜单资源,工具栏资源等等:那么,资源是如何进行消息响应和消息映射的呢? 它们的流程是: 某种资源——对应的ID号——消息映射——响应函数的声明与实 ...
- MFC消息响应机制分析
---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析 ...
- HTTP请求响应机制与响应状态码
转载来源:http://blog.csdn.net/xyw591238/article/details/51907143 HTTP协议 Internate的基本协议是TCP/IP(传输控制协议和网际协 ...
- 关于cocostudio动态添加控件触摸响应无效的学习
time:2015/04/19 1. 描述 * 把studio制作的ui加载之后,动态添加事件(比如说,单点触摸),结果回调函数(eg:onTouchBegan等)根本没有响应! * 另外,网上有朋友 ...
- Django的视图流式响应机制
Django的视图流式响应机制 Django的响应类型:一次性响应和流式响应. 一次性响应,顾名思义,将响应内容一次性反馈给用户.HttpResponse类及子类和JsonResponse类属于一次性 ...
- 生产环境缺陷来源VS 缺陷管理响应机制
生产环境缺陷主要来源于用户反馈.版本内遗留.内部反馈和监控后台报警,具体内容包含以下途径: 1.用户反馈: ① 前台电话方式 ② 意见反馈后台 ③ 第三方平台:如微博.App Store等渠道 ...
随机推荐
- Linux防火墙iptables简明教程
前几天微魔部落再次遭受到个别别有用心的攻击者的攻击,顺便给自己充个电,复习了一下linux下常见的防火墙iptables的一些内容,但是无奈网上的很多教程都较为繁琐,本着简明化学习的目的,微魔为大家剔 ...
- Android:android:gravity 和 android:layout_Gravity 的区别
LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity. android:gravity 属性是对该view中内容的限定 andro ...
- Android:ScaleType设置图片
设置例子:ImageViewId.setScaleType(ScaleType.CENTER); ScaleType:设置图片显示方式 效果预览:
- classpath、path、JAVA_HOME的作用及JAVA环境变量配置
CLASSPATH是什么?它的作用是什么? 它是javac编译器的一个环境变量.它的作用与import.package关键字有关.当你写下improt java.util.*时,编译器面对import ...
- Power Station POJ 4045
题意:给你一棵树,让你求一点,使该点到其余各点的距离之和最小.如果这样的点有多个,则按升序依次输出. 树型dp #include <cstdio> #include <cstring ...
- ajax返回son数据
JSON 只是一种文本字符串.它被存储在 responseText 属性中 为了读取存储在 responseText 属性中的 JSON 数据,需要根据 JavaScript 的 eval 语句. 函 ...
- 判断浏览器类型-----------navigator.userAgent.indexOf()
<script language="JavaScript"> <!-- function getOs() { var OsObject = "" ...
- Android 内存管理(二)
很多开发者都是从j2me或j2ee上过来的,对于内存的使用和理解并不是很到位,Android开发网本次给大家一些架构上的指导,防止出现豆腐渣工 程的出现.Android作为以Java语言为主的智能平台 ...
- short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确
这个问题以前碰到过,也研究过,发表一下: 如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确.这两个表达式都被称为赋值表达式.第二个表达式使用的是简单赋值操作 ...
- mvc 相关js
http://modernizr.com/ https://github.com/Modernizr/Modernizr/wiki 主要看下Polyfills 用于html5,用于一些老ie,fire ...