龙图教育:AS3方法和技巧(6)

2020-05-07 09:10

public class RegExpExample extends Sprite { public function RegExpExample() {

var formalGreeting:String = \

trace(informalizeGreeting(formalGreeting)); // Hi, John. var validEmail:String = \trace(validateEmail(validEmail)); // true var invalidEmail:String = \

trace(validateEmail(invalidEmail)); // false var validPhoneNumber:String = \

trace(validatePhoneNumber(validPhoneNumber)); // true var invalidPhoneNumber:String = \

trace(validatePhoneNumber(invalidPhoneNumber)); // false }

private function informalizeGreeting(str:String):String { var pattern:RegExp = new RegExp(\return str.replace(pattern, \}

private function validateEmail(str:String):Boolean {

var pattern:RegExp = /(\\w|[_.\\-])+@((\\w|-)+\\.)+\\w{2,4}+/; var result:Object = pattern.exec(str); if(result == null) { return false; }

return true; }

private function validatePhoneNumber(str:String):Boolean { var pattern:RegExp = /^\\d{3}-\\d{3}-\\d{4}$/; var result:Object = pattern.exec(str); if(result == null) { return false; }

return true; } } }

23.新的深度排序方法

24.使用ByteArray类”克隆”对象 25.相似的命名实例和静态属性 26.事件发送机制(EventDispatcher) 27.事件和事件类型大话 28. 把xml写在脚本中

21

23.新的深度排序方法

AS3中运用显示列表(display list)机制,原有的一些深度排序的方法已经不再适用了.其中一个特别的变化是在屏幕上按对象的y轴位置排列它们:在AS1或者AS2中,可以很简单的按Y轴来调整他们的深度排列顺序.而这个方法在AS3中是不行的,对象的y次序在深度的显示列表中已经没有差别了.

注:这里说的y轴次序应该是flash中的3d概念,表示的应该是屏幕中对象距离观众的远近,是一个抽象的概念.

AS3可以用一个数组存放要排序的对象,通过数组操作来实现相同的排序功能,首先把一些要排序的对象放置到一个数组中,然后按照对象的y属性排列顺序,最后要做的是按照顺序调整这些对象在显示列表中的位置. example:

var sortedItems:Array = new Array(mc1, mc2, mc3); function arrange():void {

sortedItems.sortOn(\var i:int = sortedItems.length; while(i--){

if (getChildAt(i) != sortedItems[i]) { setChildIndex(sortedItems[i], i); } } }

这里sortedItems数组存放mc1-mc3三个对象,这些对象在arrange函数中按y属性排列顺序,然后添加到显示列表中.

24.使用ByteArray类”克隆”对象

AS3新增一个ByteArray类,用它可以很方便的创建一个深层次的对象副本,所谓深层次是指这个副本包含原对象的全部引用,而不仅仅是一个简单对象的引用.也就是说用这个方法复制一个引用对象的数组,这个对象也做为复制内容的一部分.

function clone(source:Object):* {

var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0;

return(copier.readObject()); }

记得引入ByteArray类:

import flash.utils.ByteArray;

clone函数的用法:

22

newObjectCopy = clone(originalObject);

这个方法虽然可以完成深拷贝,但是生成的副本不再关联原对象的所属类.如:当复制MyClass类的

一个实例,副本不再是MyClass类的实例.此方法主要用于一般对象 如Object

25.相似的命名实例和静态属性

在AS1中类的静态属性可以和类实例属性使用相同的命名,而在AS2中不充许这样做了,现在AS3又可了.

package {

import flash.display.Sprite;

public class MyApp extends Sprite { private var variable:String;

private static var variable:String; public function MyApp() { this.variable = \MyApp.variable = \trace(this.variable); // \trace(MyApp.variable); // \trace(variable); // \} } }

26.EventDispatcher类

AS2中的EventDispatcher类(flash.events.EventDispatcher)作为一个外部类存在于mx框架(mx framework)中,现在,这个类经过完善,已经包括在Player中了,AS3中用EventDispatcher类完成所有事件的处理.

在AS3中,当需要创建一个事件处理器时候,不管是逐帧执行的事件(enterFrame event),还是按钮按下事件(mouseDown event),都需要用到EventDispatcher类.而不再像以前那样定义简单的定义一下onEnterFrame或者onPress函数就可以让自动处理事件了,也不再使用那个在AS2时候用来侦听一些无显著特点的事件的addListener方法了. AS3中只需要EventPatcher类和addEventListener(及相关函数)就ok了. Methods有:

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

removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void willTrigger(type:String):Boolean

23

注意一些变化:

AS3中addEventListener函数中只能用function做侦听,而不再是AS2时的侦听对象,因为AS3中类方法和实例关联,所以当类方法用来侦听事件的回调函数时,无论任何对象发送事件,回调函数中”this”指向原类实例.举例说明:

//定义一个类 package {

import flash.display.Sprite; import flash.events.Event;

public class MyDispatcher extends Sprite {

public function MyDispatcher() {

addEventListener(\dispatchEvent(new Event(\}

private function handleEvent(event:Event):void { trace(event.type); // \} } }

通过扩展EventDispatcher类或者继承Sprite类创建的类都具有访问EventDispatcher类的函数能力.事实上,所有的可视对象(DisplayObjects)都可以接受和发送事件的.另外,非上述类的实例可以使用addEventListener方法将用来回调的函数添加到实例,这样实例就可以用dispatchEvent方法来设置事件的回调(call).

如果一个类不是继承自EventDispatcher类(例如它已经继承了其它类),却想让它能实现EventDispatcher类所有功能,可以用EventPatcher构造函数通过聚集(aggregation)的方式来初始化这个类.记得在类中实现IEventDispatcher接口(flash.events.IEventPatcher).

package {

import flash.display.Sprite; import flash.events.Event;

public class MyDispatcher extends Sprite { public function MyDispatcher() {

var dispatcher:CustomDispatcher = new CustomDispatcher(); dispatcher.addEventListener(\dispatcher.dispatchEvent(new Event(\}

private function handleEvent(event:Event):void { trace(event.type); // \} }

24

}

import flash.events.Event;

import flash.events.EventDispatcher; import flash.events.IEventDispatcher;

class CustomDispatcher implements IEventDispatcher {

private var eventDispatcher:EventDispatcher;

public function CustomDispatcher() {

eventDispatcher = new EventDispatcher(this); }

public function addEventListener(type:String, listener:Function,

useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void {

eventDispatcher.addEventListener.apply(null, arguments); }

public function dispatchEvent(event:Event):Boolean {

return eventDispatcher.dispatchEvent.apply(null, arguments); }

public function hasEventListener(type:String):Boolean {

return eventDispatcher.hasEventListener.apply(null, arguments); }

public function removeEventListener(type:String, listener:Function,

useCapture:Boolean = false):void {

eventDispatcher.removeEventListener.apply(null, arguments); }

public function willTrigger(type:String):Boolean {

return eventDispatcher.willTrigger.apply(null, arguments); } }

上面的CustomDispatcher类不是继承自EventDispatcher类,但是通过在类的构造函数中初始化EventDispatcher实例的聚合方式,实现了EventDispatcher类的全部功能. ps:AS3中的事件机制很是复杂,kingda.org上有详细的教程.很值得一看. 27.事件和事件类型

25


龙图教育:AS3方法和技巧(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:深圳黑弧广告-员工手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: