Listener 监听器
Listener 监听器类用于监听某个事件的发生,并作出相应的处理。
例如,下面的代码创建了一个监听鼠标按下的事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   |  auto callback = [](Event* evt) {          if (evt->type == Event::MouseDown)     {                       } };
 
  auto lis = gcnew Listener(callback);
  node->addListener(lis);
 
  | 
 
上面的代码也许晦涩难懂,简单来说,当一个事件发生时,事件会逐一发送给每一个节点(node),节点再将事件转发给监听器,监听器收到事件时会调用回调函数(callback)来处理这个事件。
监听器可以监听到的事件有以下几种:
1 2 3 4 5 6 7 8 9 10
   |  enum Type {     MouseMove,       MouseDown,       MouseUp,         MouseWheel,      KeyDown,         KeyUp        };
 
  | 
 
下面的回调函数示例给出了每种类型事件的处理方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
   | 
  auto callback = [](Event* evt) {     if (evt->type == Event::MouseMove)     {                           auto mouseEvt = (MouseMoveEvent*)evt;         mouseEvt->x;             mouseEvt->y;         }     else if (evt->type == Event::MouseDown)     {                           auto mouseEvt = (MouseDownEvent*)evt;         mouseEvt->x;                 mouseEvt->y;                 mouseEvt->button;        }     else if (evt->type == Event::MouseUp)     {                           auto mouseEvt = (MouseUpEvent*)evt;         mouseEvt->x;                 mouseEvt->y;                 mouseEvt->button;        }     else if (evt->type == Event::MouseWheel)     {                           auto mouseEvt = (MouseWheelEvent*)evt;         mouseEvt->x;                 mouseEvt->y;                 mouseEvt->delta;         }     else if (evt->type == Event::KeyDown)     {                           auto keyEvt = (KeyDownEvent*)evt;         keyEvt->key;             keyEvt->count;       }     else if (evt->type == Event::KeyUp)     {                           auto keyEvt = (KeyUpEvent*)evt;         keyEvt->key;             keyEvt->count;       } };
 
  | 
 
监听器的启动和暂停
创建监听器后,可以调用 start 和 stop 函数启动和暂停一个监听器
1 2 3 4 5
   | auto lis = gcnew Listener();
  lis->start();
  lis->stop();
   | 
 
监听器的添加和移除
创建监听器后,需要将其添加到节点上,才可以接收发送到该节点的事件:
1 2 3 4 5
   | auto lis = gcnew Listener();
  node->addListener(lis);
  node->removeListener(lis);
   | 
 
监听器可以有名字,通过名字可以启动、暂停、移除指定的监听器
1 2 3 4 5 6 7 8 9 10 11
   | auto lis = gcnew Listener(); node->addListener(lis);
 
  lis->setName("my_listener");
  node->startListener("my_listener");
  node->stopListener("my_listener");
  node->removeListener("my_listener");
   | 
 
也可以启动、暂停、移除一个节点上的所有监听器
1 2 3 4 5 6
   |  node->startAllListeners();
  node->stopAllListeners();
  node->removeAllListeners();
 
  | 
 
自定义事件
出了上面几种预先定义的事件,用户也可以自己定义事件。
下面的代码展示了如何创建自定义的事件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   |  enum MyEventType {          First = Event::Type::Last + 1 };
 
  struct MyEvent 	: public Event {          MyEvent() : Event(MyEventType::First) {}
           int value = 0; };
 
  | 
 
使用下面的代码将自定义事件分发给节点及其所有子节点:
1 2 3 4 5 6
   |  MyEvent* evt = gcnew MyEvent;
  evt->value = 3;
  node->dispatch(evt);
 
  | 
 
在监听器中处理自定义事件:
1 2 3 4 5 6 7 8 9 10 11 12
   |  auto callback = [](Event* evt) {          if (evt->type == Event::MouseDown)     {                           auto myEvt = (MyEvent*)evt;         myEvt->value;        } };
 
  |