我有一个带有 4 个按钮的 MC(一个按钮栏)。向每个按钮添加单独的事件侦听器或向父按钮添加单个事件侦听器并使用 e.target.name 来检测单击了哪个更有效?谢谢!
2 回答
事件成本很高,对于具有大量事件处理程序的高性能应用程序,您应该考虑使用回调而不是事件模型。
ActionScript 3.0 事件模型基于对象分派的概念。事件模型是面向对象的,并针对代码重用进行了优化。dispatchEvent() 方法循环遍历侦听器列表并在每个注册对象上调用事件处理程序方法。但是,事件模型的缺点之一是您可能会在应用程序的生命周期内创建许多对象。
与使用传统回调函数相比,使用本机事件模型可能会更慢并消耗更多内存。必须在内存中创建和分配事件对象,这会降低性能。例如,在侦听 Event.ENTER_FRAME 事件时,会在每个帧上为事件处理程序创建一个新的事件对象。由于捕获和冒泡阶段,显示对象的性能可能特别慢,如果显示列表很复杂,这可能会很昂贵。
使用交互式对象(例如 MovieClip 或 Sprite 对象)时,运行时会执行本机代码来检测和处理鼠标交互。当屏幕上显示许多交互对象时,检测鼠标交互可能会占用大量 CPU,尤其是当它们重叠时。
如果可能,请考虑禁用鼠标交互,这有助于您的应用程序使用更少的 CPU 处理,从而减少移动设备上的电池使用量。
根据动画的实际经验,我可以调用数千个回调,而不是每帧有限数量的处理程序。
根据您的示例,组件架构使事件能够冒泡到父控件;因此,按钮栏捕获事件是一种更好的设计模式。
根据按钮与按钮栏的紧密耦合程度switch
,名称/实例块是有意义的,除非您正在调度从按钮栏控件抽象按钮控件的自定义事件。
这是你可以使用的。
addChild("YourButtonName").addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
private function mouseDownHandler(event:MouseEvent):void {
"Your mouse click Action is Here"
}