AS3 的事件机制(2)

该文章来自黑羽,觉得很有收藏价值。

如何接收事件?如何做到AS3.0的标准事件编程?
Event改变的部分很多,正在想怎样用一个有条理的方式来讲解Event和它相关的诸多内容,让我们感到比较容易理解,记忆和接受。
准备这样来讲解:
先给个接受事件的代码例子。在例子中,指出:
(1) Event对象发生了什么变化
(2) addEventListener语法的不同,原因,和const型必要性和用法
(3) Listener和As2.0有何不同,和this关键字的“改进了的记忆力”

先采用这个Document Class的示例。
Document Class的含义和相关用法并不难,忘了的看第3篇教程:
AS3.0教程(3):Document Class特色为我们带来了什么?

新建一个as文件,拷贝以下代码,命名为AddListener.as。
新建一个fla,命名为 "黑羽黑羽我爱你.fla"(本教程推荐使用,倘若不遵从可能导致喝凉水塞牙泡MM被踢炒股被套等严重后果,霍哈哈。Just kidding。)。设置它的文档类(Document Class)为AddListener.

package  {
    import flash.display.Sprite;
    import flash.events.MouseEvent;    
    
   
//哈哈,看到了没,Document Class不仅可以扩展MovieClip,也可以扩展Sprite
   
//package里面的类名要和文件名相同
    public class AddListener extends Sprite {
        
public function AddListener() {
            
//用package外面定义的类KingdaSprite创建一个实例,由于同文件中,所以不用import啦
            var outsideChild:KingdaSprite = new KingdaSprite(0x00FF00"outside_sprite");
        addChild(outsideChild);
//没有了这一句,你啥都看不到。
   
            outsideChild.addEventListener(MouseEvent.CLICK, inclassHandler);
//注册类里面的侦听器
            outsideChild.addEventListener(MouseEvent.CLICK, outsideHandler);//注册类外面的侦听器                       
        }

        
private function inclassHandler(event:MouseEvent):void {
            trace(
"类里面的侦听器侦听到MouseEvent事件: " + event);
     trace(
"this关键字指向:"+this);
        }

        
    }

}

function outsideHandler(
event :MouseEvent): void   {
      trace(
"类外面的侦听器侦听到MouseEvent事件: " + event);
      trace(
"this关键字指向:"+this);
}

import flash.display.Sprite;
import flash.events.MouseEvent;
// 这个类就是画一个矩形,然后你点击这个矩形会发出标准鼠标click的事件
class  KingdaSprite extends Sprite  {
  
public var nickname:String;
  
public var ColorNum:uint;

    
//colorNumber就是#ffcc00这种类型的数,在AS3中推荐用新的uint型来标记它
     public function KingdaSprite(colorNumber:uint, nameString:String) {
         ColorNum 
= colorNumber;
         nickname 
= nameString;                  
         graphics.beginFill(ColorNum);
         graphics.drawRect(
0,0,100,100);
         graphics.endFill();
     }

}

 

鼠标一点击创建出来的绿色矩形,会看到输出

类里面的侦听器侦听到MouseEvent事件:
[MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=64 localY=80 stageX=64 stageY=80 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
this关键字指向:[object AddListener]

类外面的侦听器侦听到MouseEvent事件:
[MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=64 localY=80 stageX=64 stageY=80 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
this关键字指向:[object global]

演示完毕,我们来讲第一个话题
(1) Event对象发生了什么变化
            AS2.0中创建event 对象是很随意的,只要这个对象有一个String属性叫做type的就可以了,甚至连target都可以省掉。不要以为这不规范不应该做,看看Flash类源码,Macromedia的程序员可不只一次的这样使用过。所谓上梁不正下梁歪,就是这样。(其实严格说也没什么不对,有时候是不需要target。但没有标准就是不好)
然后你在Event Object中爱添加什么就添加什么。极其自由,也就等于极其混乱。
          3.0不同了,所有的事件必须都要继承自Event这个类(全饰名称flash.events.Event)。不然,哼哼,事件发送是不能成功地。
          说说Event这个类,那叫一个NB。AS3.0的基石类是Object,Event是直接继承自Object的,开国大佬级别的。它里面定义了一些基本的事件名称,比如ACTIVATE(FlashPlayer得到系统焦点时事件),ADDED(对象被添加到显示时发送的事件)。AS3.0中有个好功能是cancel事件,但Event中这些基本事件统统是不能被cancel的,听起来似乎很NB。这不细说了,Event太多内容了。以后写高级内容时在提到如何运用吧。那叫一个爽字了的!要想Flash玩的转,Event类必须很精通。正所谓江湖人称:"平生不识Event,就称闪客也枉然。"
          这样有什么好处?好处太多了,最大的好处是一,规范了事件的定义,二,大量由此衍生的类省去了我们大量的时间和重复开发的成本。
         规范事件的定义放到下一部分讲。至于内置的Event子类好处,大家请看上面fla的运行输出:
         MouseEvent就是内建的一个Event子类,它的好处一看它的内容就明白:
从AS3.0起,任何一次点击事件我们都可以得到:
    1.事件发生时鼠标的MC相对坐标(localX=64 localY=80)和绝对坐标(stageX=64 stageY=80)。
    2.ctrl键,shift键,alt键有没有按下。你试试按着ctrl键再点击一下方块,那么ctrlKey就为true了。爽不爽?
        (其余参数不解释,涉及到高级运用。部分会在Event最后一节提到该怎么运用)

光这一个MouseEvent类,怎么着都觉得值人民币20块。

(2) addEventListener语法的不同,和const型必要性

          本例如果是AS2.0,那么代码是这样写的:outsideChild.addEventListener("click", inclassHandler);

          本例是3.0,如果你trace一下其中的MouseEvent.CLICK,输出的也是字符串"click"。
看起来AddEventListener的方法和以前也没什么大的出入。和这世界上大多数相同的事物一下,表象的类似却掩盖着本质的巨大差异。 我们先从最小的差异讲起:

1.使用类静态属性,用const定义事件字符串名称变量AS3.0中用了一个新的关键字定义了事件名称字符串变量,代码是:public static const CLICK:String = "click";

const,是英文constant的缩写,意思使不变的,常量。那就意思很明白了,一旦这种类型的常量被定义就不可再更改。好处通俗的说就是规范好项目,规范你自己,也规范任何其他项目人员,动不了这个变量。
你可能还是会不屑一顾,这么小的一个改动,对我没什么用!
可我的AS2.0开发血泪经验是,我曾经花了一个下午来找bug,最后却发现是某个类的addEventlistener()里面的事件名称"click"手误打成了"cilck"。编译器可不管这个。
如果是3.0,你打成了MouseEvent.CILCK,那么编译时立刻会报错提醒你,多好啊。一个项目一个人做十几个类还好办,自己认真点还能顶的住;如果是一个项目几个人几十个类,那么没有const和static的帮忙,管理事件类型还真是有点麻烦。即使实现了也没有AS3.0这么简单直观。
回到代码,我们要记住,日后我们开发自己的Event类时,也要像这样,用public static const来定义我们自己的事件名称。
如何自定义自己的事件,我会在EventDispatch那一节讲述。

看看代码,我们还发现AS3.0中侦听器也发生变化了,只能用function来做侦听器,不再用Object。

2.addEventListener高级运用AS3.0中对侦听器的改进远远不止以上这些,看一看addEventListener的实现接口

 

function addEventListener(eventName:String,  
listener:Object, 
useCapture:Boolean
= false
priority:Integer
= 0
useWeakReference:Boolean
= false ):Boolean;

 

哇塞,有三个莫名奇妙的参数。可是当你知道这三个参数背后隐藏的巨大改进之后,相信你要大叫三个哇塞。第一个神秘参数,目前暂不解释,埋个伏笔,留到EventDispatcher那一节,讲ActionScript3崭新的Event Flow事件流机制.第二个参数:优先级。 有趣吧,在ActionScript 3.0中我们可以控制事件的优先级,从而达到控制function侦听器的执行顺序。如果你不填这个参数,那么事件默认为同一个级别0,事件的执行按先来后到的天经地义的顺序。如果设为1,那么事件级别降一个档次,稍后执行。数字越高优先级越高。级别可以为负数。(注意: Flex Builder 2 Beta3中事件级别是越低越高)

好好利用这个功能吧,在AS2.0中要想达到同样效果可不知道要多费多少力气!
第三个参数,讲的是是否设为弱引用。

兄弟们初学As2.0时一定经常忘了在删除Listener对象时,却忘了removeEventListener吧。这会导致很多莫名奇妙的情况发生。也是最常见的诡异bug种类之一。即使老鸟偶尔也会被阴一把。

最郁闷的是这种情况往往不被发现,在后台默默的消耗大量资源。
现在可以用弱引用可以在某种程度上解决这种bug。
设为true,就是告诉垃圾回收器,这个侦听器function的引用是弱引用。一旦这个侦听器在运行时只剩下了这一个弱引用,那么垃圾回收器可以不理它,直接把它回收咯屁了,节省资源。

从AS3.0引入这个弱引用这个概念就可以看出,AS3.0是如何的重视资源管理和有效率的运用。一个标准的重量级的程序语言必须具有这样的特征。
现在AS3.0有了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
在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、付费专栏及课程。

余额充值