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; } };
|