Control中有九种可能的事件,定义在.h文件中,另外还定义四种状态,用来表示控件高亮等。

在初始化控件的时候:

bool Control::init()
{
if (Layer::init())
{
// Initialise instance variables
//初始化控件的状态
_state=Control::State::NORMAL;
//开启控件
setEnabled(true);
//不选中
setSelected(false);
//不高亮
setHighlighted(false);
//获取分发器
auto dispatcher = Director::getInstance()->getEventDispatcher();
//创建单点触摸监听器
auto touchListener = EventListenerTouchOneByOne::create();
//设置触摸吞没,触摸控件时,控件下的其它东西不会接触到触摸事件
touchListener->setSwallowTouches(true);
//创建触摸不同阶段的回调函数
touchListener->onTouchBegan = CC_CALLBACK_2(Control::onTouchBegan, this);
touchListener->onTouchMoved = CC_CALLBACK_2(Control::onTouchMoved, this);
touchListener->onTouchEnded = CC_CALLBACK_2(Control::onTouchEnded, this);
touchListener->onTouchCancelled = CC_CALLBACK_2(Control::onTouchCancelled, this);
//添加场景图优先级的触摸监听器,也就是说优先级为0
dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); return true;
}
else
{
return false;
}
}

添加场景图优先级的触摸监听器

void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
{
CCASSERT(listener && node, "Invalid parameters.");
CCASSERT(!listener->isRegistered(), "The listener has been registered."); if (!listener->checkAvailable())
return;
//设置监听器的节点参数
listener->setAssociatedNode(node);
//设置优先级
listener->setFixedPriority(0);
//设置为注册
listener->setRegistered(true);
//添加给存储监听器的全局数组添加元素
addEventListener(listener);
}

添加事件监听器到全局数组中

void EventDispatcher::addEventListener(EventListener* listener)
{
if (_inDispatch == 0)
{
//直接添加
forceAddEventListener(listener);
}
else
{
//正在使用,延时添加
_toAddedListeners.push_back(listener);
}
#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
if (sEngine)
{
sEngine->retainScriptObject(this, listener);
}
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
listener->retain();
}

直接添加

void EventDispatcher::forceAddEventListener(EventListener* listener)
{
EventListenerVector* listeners = nullptr;
//通过listener获取ID
EventListener::ListenerID listenerID = listener->getListenerID();
//通过ID查找是否在存储所有listener的map中,这个map是用来存储监听器ID和监听器数组的
auto itr = _listenerMap.find(listenerID);
//如果没找到
if (itr == _listenerMap.end())
{
//新建一个监听器数组类型
listeners = new (std::nothrow) EventListenerVector();
//和对应的ID一起加入map中
_listenerMap.emplace(listenerID, listeners);
}
else
{
//如果找到了就获取它的second,即存储listener的数组
listeners = itr->second;
}
//添加到对应ID的listeners中
listeners->push_back(listener);
//如果优先级是0
if (listener->getFixedPriority() == 0)
{
//设置场景图的优先级
setDirty(listenerID, DirtyFlag::SCENE_GRAPH_PRIORITY);
//获取关联节点
auto node = listener->getAssociatedNode();
CCASSERT(node != nullptr, "Invalid scene graph priority!");
//将节点和监听器放入_nodeListenersMap中
associateNodeAndEventListener(node, listener); if (!node->isRunning())
{
listener->setPaused(true);
}
}
else
{
setDirty(listenerID, DirtyFlag::FIXED_PRIORITY);
}
}

要注意的地方是,fixedPriority事件是不绑定节点的。

setDirty看的还不是很明白,后补。

第一次看CCControl的更多相关文章

  1. 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践

    写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...

  2. 对于程序开发者看书(指实在的书而不是PDF)的好处。(个人看法而已)

    书是实在的东西.不同PDF.他能带你进入一种学习态度的环境 书上已经所列了知识点.看了.那些知识点就是你的. 第一次看,未必完全理解到里面的东西.说不定过几天,几周,几个月,甚至几年.再看.就有可能看 ...

  3. 看牙与IT项目

    周末为了一颗牙第五次去牙科诊所,得到的消息是:还需要观察至少2周才能做牙冠,同时发现了较深的牙结石需要做刮治,刮治疗需要2次.因此至少要再去医院3次.从去年的六月体检发现这颗牙的问题,目前最乐观估计也 ...

  4. 【前端童鞋看过来!】给大家分享网盘里前端相关书籍,主要是和网络通信(HTTP/TCP/IP)及javascript相关的

    百度云链接:https://pan.baidu.com/s/1kUPdf5H(无密码) 截图: <HTTP权威指南> [豆瓣书评]:此书第一部分是HTTP的概略,如果你没有时间,通读第一部 ...

  5. 整合第二次(SSM第一次)------------>spring+struts2+mybatis

    今天我们来讲解一下SSM整合,感觉整合这个比上一篇整合更费时,原因在于自己不太熟悉MyBatis了,下午的时候恶补了一下,看了一下相关的文档和PDF电子书,知识真的是你不用就会忘记的,以后还是不能懈怠 ...

  6. 【转】如果有人让你推荐Python技术书,请让他看这个列表

    入门级 <Head First Python>+ 入门级 + 微信49票 + 豆瓣评分 9.5 推荐语: 66:浅显易懂,编排的顺序特别,有大量插图.对话,不感觉枯燥 古心:通熟易懂,配有 ...

  7. 看懂Qt源代码-Qt源码的对象数据存储

    第一次看Qt源代码的人都会被其代码所迷惑,经常会看到代码中的d_ptr成员.d_func(函数)和Q_DECLARE_PRIVATE等奇怪的宏,总是让人一头雾水,下面这篇文章转自http://www. ...

  8. 第一次用THINKPHP 报路径错

    我第一次 看网上写的代码 define('THINK_PATH','ThinkPHP');define('App_NAME','43');define('App_PATH','.'); require ...

  9. 面试官:你看过Redis数据结构底层实现吗?

    面试中,redis也是很受面试官亲睐的一部分.我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构.你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap. ...

随机推荐

  1. vmware中centos、redhat桥接网络配置

    第一步 第二步 第三步 centos: redhat:

  2. HZOJ 分组

    打了好多个代码. 对于测试点1,11:手动模拟. void QJ1_11() { ) { int tk; ]+a[]))tk=; ; if(tk<=k) { puts("); puts ...

  3. H3C 总线型以太网拓扑扩展

  4. H3C DCC的特点

  5. 【t074】上学路线

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 你所在城市的街道好像一个棋盘,有a条南北方向的街道,和b条东西方向的街道. 南北方向的a条街道从西到东 ...

  6. jQuery中的siblings()的用法

    siblings  英文翻译    兄; 弟; 姐; 妹;   的意思 siblings()用于查找当前元素的同胞元素,就是拿到当前元素的兄弟节点(不包括自己). 给当前元素设置新的样式,并删除当前元 ...

  7. [转载] linux、Solaris下xdmcp远程桌面服务

    原文链接 http://youlvconglin.blog.163.com/blog/static/52320420106243857254/ 使用图形界面远程登录linux和Solaris,首先要在 ...

  8. Activiti - 新一代的开源 BPM 引擎

    http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...

  9. SpringBoot集成thymeleaf(自定义)模板中文乱码的解决办法

    楼主今天在学习SpringBoot集成thymelaf的时候报了中文乱码的错误,经过网上的搜索,现在得到解决的办法,分享给大家: package com.imooc.config; import or ...

  10. vue-上传文件

    <label for="exampleInputFile">头像</label> <img :src=" imgsrc != '' ? im ...