监听器3个bool类型成员变量。

监听器能设置是否能够接收事件。

能随时接收事件进行处理,此时把它看做工作状态,需要满足条件:

     _paused = false;
    _isEnabled = true;

监听器init方法执行上述语句,使得不管哪种监听器,初始化时都默认处于工作状态。

监听器init方法还执行了:

    _isRegistered = false;

也就是说,监听器默认没有注册。

1. _paused

init方法置_paused为false。

监听器的暂停与否仅用于场景图的监听器。自定义优先级的监听器的暂停标志一直为false。

场景图监听器关联的node运行onEnter onExit方法中,监听器会被自动设置暂停标志。

在onEnter方法中,会调用到resume()。该方法中,事件分发器对node关联的所有监听器设置setPaused(false),包括待添加容器里的监听器。

void Node::resume()
{
_scheduler->resumeTarget(this);
_actionManager->resumeTarget(this);
_eventDispatcher->resumeEventListenersForTarget(this);
}

同理,在onExit方法,事件分发器对这些监听器setPaused(true)。

void Node::pause()
{
_scheduler->pauseTarget(this);
_actionManager->pauseTarget(this);
_eventDispatcher->pauseEventListenersForTarget(this);
}

2. _isEnabled

init方法置_isEnabled为true。

当自定义优先级监听器需要“暂停”,需要不接收事件时,不能更改暂停标志,要调用setEnabled(false)更改_isEnabled标志。

自定义优先级监听器暂停标志永远为false。

3. _isRegistered

init方法置_isRegistered为false。

当调用addEventListenerWithFixedPriority addEventListenerWithSceneGraphPriority两方法添加监听器到监听器容器时,先断言,条件是!listener->isRegistered(),即要求参数监听器未注册才能添加到容器里,之后再设置注册标记setRegistered(true)。

简而言之,未注册的监听器才能加到容器里。

remove方法删除监听器时,都要先对监听器先setRegistered(false)。如果正在进行事件分发,删除的操作在分发后的updateListeners方法执行,该方法会把之前setRegistered(false)的监听器删除。

4. 进行事件分发时

分发事件时dispatchEvent(Event*)函数的分发过程在dispatchEventToListeners方法中。

该方法对遍历到的每个监听器执行:

                if (l->isEnabled() && !l->isPaused() && l->isRegistered() && onEvent(l))
{
shouldStopPropagation = true;
break;
}

&&是短路操作,也就是说在监听器处理事件之前,需要确保_isEnabled(启用监听器)_paused(没暂停监听器)_isRegistered(已注册监听器)。

最新文章

  1. 详解Javascript中正则表达式的使用
  2. 【repost】js中(function(){…})()立即执行函数写法理解
  3. jquery——移动端滚动条插件iScroll.js
  4. VM环境下,快速复制多个SQLServer实例,环境调整
  5. css通用小笔记02——浮动、清除(三个例子)
  6. 23. javacript高级程序设计-数据存储
  7. jqyery dataTable 基本用法
  8. Codeforces Round #111 (Div. 2)
  9. Darwin Streaming Server 简介
  10. Android - 封装Fragment不依赖于Activity
  11. winform,wpf全屏 还显示任务栏的解决方法
  12. ORA-12514(TNS:监听程序当前无法识别...)
  13. Javascript关闭详细说明
  14. JMeter 之Synchronizing Timer运行原理
  15. 日程管理 FullCalendar
  16. prometheus-operator 详细总结(helm一键安装)
  17. [工作日志] 2019-04-16 入参是list
  18. python 2解决编码问题
  19. 字符串相关的hash值(一)
  20. 暑期OI大电影——不看后悔整个OI生涯!

热门文章

  1. 关于设置tomcat端口为80的事
  2. Day 26 网络基础 3
  3. 提交任务到spark(以wordcount为例)
  4. [Linux] CentOS 显示 -bash: vim: command not found
  5. 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition
  6. 基于Spark的电影推荐系统(电影网站)
  7. django查询表记录的十三种方法
  8. Spring 梳理-webApplicationContext 与servletContext
  9. 使用 Jenkins 与 Sonar 集成对代码进行持续检测
  10. Flutter学习笔记(29)--Flutter如何与native进行通信