上一篇中,我们主要分析了EventDispatcher类中如何添加事件,这一篇,来看一下事件的分发处理。 1、 /** Dispatches the event. 这个函数是事件分发的主入口 * Also removes all EventListeners marked for deletion from the * event dispatcher list. * * @param event The event needs to be dispatched. */ void dispatchEvent(Event* event); -→>>> void EventDispatcher::dispatchEvent(Event* event) { if (!_isEnabled) return; updateDirtyFlagForSceneGraph(); DispatchGuard guard(_inDispatch); //如果是触摸事件,则通过dispatchTouchEvent函数进行处理,这个具体后面再分析 if (event->getType() == Event::Type::TOUCH) { dispatchTouchEvent(static_cast<EventTouch*>(event)); return; } //获取事件的listenerID auto listenerID = __getListenerID(event); //对所有的事件监听函数进行排序 sortEventListeners(listenerID); auto iter = _listenerMap.find(listenerID); if (iter != _listenerMap.end()) { auto listeners = iter->second; auto onEvent = [&event](EventListener* listener) -> bool{ event->setCurrentTarget(listener->getAssociatedNode()); listener->_onEvent(event); return event->isStopped(); }; //执行具体的事件监听函数 dispatchEventToListeners(listeners,onEvent); } //更新监听事件列表 updateListeners(event); } 2、移动设备中,触摸事件很重要,而且这里对触摸事件的分发,单独有一个函数dispatchTouchEvent,这个函数代码太长了,就不进行分析了,其实和2.X的思路是一样的。 3、对于Custom事件,我们可以直接通过下面这个函数进行分发,本质上还是调用dispatchEvent方法。 void EventDispatcher::dispatchCustomEvent(const std::string &eventName,void *optionalUserData) { EventCustom ev(eventName); ev.setUserData(optionalUserData); dispatchEvent(&ev); }