as3事件流机制彻底理解

as3和dom的事件流都分三个阶段:捕获阶段、目标阶段、冒泡阶段。如果记不住这三个阶段的顺序,想象以下捕鱼的过程,捕鱼也分三个阶段:撒网、捕捉,捞起,三个阶段从上向下。


为什么要事件流要分三个阶段呢?


这一切都是因为“显示列表”,没有显示列表,也就不会有事件流。在显示列表中,假设,s:舞台;c:容器;b:按钮。


点击按钮b,b应该发出click事件,这没错。从常识上来说,点击了b,也就间接点击了c吧,因为c包含b,那么c也应该发出click事件,同理s也应该发出click事件。问题就来了,s、c、b发出click事件的顺序该如何处理?


用盒子模型来理解,要想“摸东西”,肯定要从最外层的盒子开始摸起,层层向内摸,所以事件流的第一阶段是捕获阶段,由外至内。接着就是目标阶段。摸完东西,手就要缩回来,缩回来的过程就是冒泡阶段。


捕获阶段和目标阶段我们很容易理解,从外向内依次发出事件,那为什么还要有冒泡阶段呢?冒泡阶段是为了满足用户灵活处理事件的需求而产生的。只有捕获和目标阶段,那么用户就必须先处理s的click事件,然后是c的click事件,最后才是b。但好多时候,用户是想先处理b的click事件,然后才是c,最后是s,冒泡阶段由此而生。


addEventListener(type:String, listener:Function, useCapture:Boolean= false, priority:int= 0, useWeakReference:Boolean= false):void

用addEventListener监听事件,默认是目标阶段或者冒泡阶段,只有useCapture=true的时候,才是捕获阶段。b只有目标阶段,s和c有捕获和冒泡两个阶段。


function onClick(e:MouseEvent):void

{

    trace(e.target);

    trace(e.currentTarget);

}


b.addEventListener(MouseEvent.CLICK, onClick,  false); //e.target == e.currentTarget == b

b.addEventListener(MouseEvent.CLICK, onClick,  true); //不会有任何效果。


c.addEventListener(MouseEvent.CLICK, onClick,  false); //e.target ==  b,e.currentTarget == c

c.addEventListener(MouseEvent.CLICK, onClick,  true); //e.target ==  b,e.currentTarget == c


s.addEventListener(MouseEvent.CLICK, onClick,  false); //e.target ==  b,e.currentTarget == s

s.addEventListener(MouseEvent.CLICK, onClick,  true); //e.target ==  b,e.currentTarget == s


注意,假如b.mouseChildren=false; b.mouseEnabled=false; 那么c的click事件中e.target ==  c。因此,InteractiveObject.mouseEnabled==true的时候,通过事件流使父容器发出事件的,InteractiveObject.mouseEnabled==false的时候,跟非InteractiveObject一样,是通过填充父容器,使父容器直接发出事件。


记住,事件流因显示列表而生,像捕鱼一样有三个阶段:捕获、目标、冒泡。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Open3D中,事件机制是通过注册回调函数来实现的。Open3D提供了几个注册回调函数的方法,用于捕捉和处理不同类型的事件。下面是一些常用的事件和相应的注册回调函数: 1. `register_animation_callback(callback_func)`: 注册一个回调函数,在每一帧动画中触发。 2. `register_key_callback(callback_func)`: 注册一个回调函数,在按下或释放键盘按键时触发。 3. `register_mouse_callback(callback_func)`: 注册一个回调函数,在鼠标点击和移动时触发。 4. `register_select_callback(callback_func)`: 注册一个回调函数,在点击几何体或选择区域时触发。 这些回调函数可以接收不同的参数,以提供有关事件的信息。例如,`register_key_callback()`和`register_mouse_callback()`回调函数的参数包括`key`、action`和`mods`,分别表示按下/释放的键、动作类型和修改键的状态。而`register_select_callback()`回调函数的参数是一个`SelectionEvent`对象,包含有关选中几何体或点的信息,如选中类型、选中索引等。 下面是一个示例代码,展示了如何使用Open3D的事件机制: ```python import open3d as o3d def animation_callback(vis): # 在每一帧动画中执行操作 # ... pass def key_callback(vis, key, action, mods): # 键盘按键事件处理 # ... pass def mouse_callback(vis, event): # 鼠标事件处理 # ... pass def select_callback(vis, event): # 点击选中事件处理 # ... pass # 创建Open3D可视化场景 vis = o3d.visualization.Visualizer() vis.create_window() # 注册回调函数 vis.register_animation_callback(animation_callback) vis.register_key_callback(key_callback) vis.register_mouse_callback(mouse_callback) vis.register_select_callback(select_callback) # 显示可视化场景 vis.run() vis.destroy_window() ``` 在这个示例中,我们创建了一个Open3D可视化场景,并使用不同的`register_xxx_callback()`方法注册了不同类型的回调函数。每当相应的事件发生时,注册的回调函数将被调用。 你可以根据实际需求,在回调函数中添加自定义的逻辑,来处理相应的事件。 希望这个示例能帮助你理解Open3D的事件机制。如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值