`
FlexEye
  • 浏览: 17511 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

AS3 的事件机制(二)

阅读更多

如何接收事件?如何做到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有了!


本文来自CSDN博客:http://blog.csdn.net/baijinwen/archive/2007/04/04/1551734.aspx

分享到:
评论

相关推荐

    as3事件属性

    ### AS3事件属性详解 #### 一、引言 在ActionScript 3.0 (简称AS3)中,事件处理机制是程序设计的核心之一。掌握AS3中的事件属性及其应用场景对于开发高质量的交互式应用程序至关重要。本文将深入探讨AS3事件流中的...

    AS3中的事件处理.txt

    ### 二、AS3中的主要事件类型 #### 2.1 MouseEvent `MouseEvent` 是AS3中最常用的事件类型之一,用于处理与鼠标相关的操作。例如,当用户点击鼠标左键时触发的 `MouseEvent.CLICK` 事件,或者当鼠标移动时触发的 `...

    第五节 AS3事件.docx

    总之,AS3事件机制是通过`addEventListener`方法注册事件处理函数,使用预定义的事件常量来指定事件类型。理解并熟练运用事件处理是AS3开发的关键技能之一,它使得代码更加模块化,易于维护和扩展。在实际开发中,应...

    Flash CS3 +AS3键盘事件

    通过以上内容,我们了解了Flash CS3与AS3中的键盘事件处理机制,这为创建丰富的交互体验奠定了基础。实际应用中,开发者可以根据需求进行更复杂的逻辑设计,如组合键、延迟处理、按键持续时间等。结合`keyCodes.fla`...

    最经常遇到的AS3面试题

    AS3事件机制使用Observer模式,允许对象之间的松耦合,事件分发者可以将事件发送给事件监听器,事件监听器可以选择是否接收事件。 11. addEventListener的使用方法 addEventListener方法用于添加事件监听器,需要...

    FLASHAS3代码

    5. 事件模型:AS3采用了基于事件的编程模型,事件监听和分发机制让程序响应用户交互和系统变化。如点击按钮、加载完成等事件,都可以通过addEventListener()和removeEventListener()来处理。 五、图形绘制 6. 可...

    AS3 五子棋源码

    学习如何使用AS3的调试器和错误处理机制对于理解源码也很重要。 9. **互动性**:作为一款多人游戏,五子棋可能包含网络对战功能。如果源码包含这部分,你将看到AS3如何处理网络通信,如使用Socket或SharedObject...

    as3中文学习文档

    #### 二、AS3编程基础 - **变量与数据类型**:AS3支持多种数据类型,包括基本数据类型(如Number、String等)和复杂数据类型(如Array、Object等)。了解这些数据类型对于编写有效的代码至关重要。 - **运算符与...

    as3滚动文字

    AS3的事件驱动模型使得我们可以响应用户的交互。例如,可以监听`Timer`事件来控制滚动速度,或者监听`MouseEvent`来暂停或改变滚动方向。 7. **代码实现**: 创建一个`Timer`对象来定期更新文本,每次更新时移动...

    魔力学堂 flash as3 游戏 源代码

    总结,"魔力学堂"作为一款使用Flash AS3开发的游戏,其源代码揭示了AS3在游戏开发中的应用深度和广度,包括面向对象编程、事件驱动机制、图形动画、网络通信等多个方面。通过学习和分析,开发者不仅可以提升AS3编程...

    AS3对对碰游戏

    1. **事件驱动编程**:AS3中的事件模型使得用户交互(如鼠标点击)能够触发特定的响应,这对于游戏中的点击事件处理至关重要。 2. **图形绘制**:通过`flash.display.Sprite`类,开发者可以绘制和操作游戏中的图形...

    air内嵌网页 as3

    3. AS3回调:在网页中,可以定义一个全局函数并暴露给AS3,然后在AS3中调用这个函数,实现回调机制。 ```javascript window.external.myCallback = function(data) { // 在这里处理AS3回调的数据 }; ``` ```...

    Flash as3 相册

    《Flash AS3 相册制作详解》 Flash AS3 相册是一种利用Adobe Flash软件和ActionScript 3.0编程语言实现的动态图片展示工具。它以其丰富的视觉效果和交互性,深受网页设计师和开发者喜爱。本文将深入探讨Flash AS3 ...

    as3离线学习参考手册

    AS3还支持事件驱动编程,通过addEventListener和removeEventListener来处理用户交互或程序内部事件。 二、面向对象编程 AS3中的类是创建对象的蓝图,你可以自定义类以满足特定需求。类的继承(extends)和接口...

    黑羽as3教程

    ### 黑羽AS3教程解析 #### 一、ActionScript 3.0简介及特性 **ActionScript 3.0**(简称AS3)是一种强大的编程语言,主要用于Adobe Flash Player和Adobe AIR等平台上进行交互式内容和应用程序的开发。与前代...

    as3 游戏源码

    二、AS3游戏源码结构 AS3游戏源码通常包括以下几个主要部分: 1. 主类:游戏的主入口点,负责初始化游戏环境、加载资源、创建游戏循环。 2. 游戏循环:使用 ENTER_FRAME 事件来更新游戏状态,处理玩家输入、游戏...

    as3平台下的连连看

    总结起来,“连连看”游戏在AS3平台上利用其面向对象的特性、强大的图形处理能力和事件驱动模型,构建出一款具有挑战性和娱乐性的游戏。通过精心设计的数据结构、算法和交互,为玩家提供了丰富的游戏体验。不断根据...

    as3算法大全

    AS3(ActionScript 3.0)是Adobe Flash平台的核心编程语言,用于创建交互式网页内容、游戏以及动画。在页游开发中,算法扮演着至关重要的角色,它们是解决问题和优化性能的关键工具。"AS3算法大全"这个资源包含了AS3...

    flashas3 api使用手册

    AS3相较于之前的版本,进行了大量的语法改进和性能提升,包括类的完全支持、强类型系统和垃圾回收机制。AS3中的所有数据都是对象,这使得它更接近于传统的面向对象编程语言。基础知识点包括变量声明(var关键字)、...

    as3实现的连连看源代码

    总结,AS3实现的连连看源代码展示了如何利用AS3进行游戏开发的基本流程,包括图形绘制、事件处理、数据结构和算法的运用。深入学习和理解这一源代码,将有助于开发者更好地掌握AS3语言特性,并为开发其他类型的Flash...

Global site tag (gtag.js) - Google Analytics