加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

<Flash入门>对AS语言的一些理解

发布时间:2020-12-15 06:56:15 所属栏目:百科 来源:网络整理
导读:以下是我学习Flash一周以来对 AS 代码的一些理解,编码击规范的一些看法和对 MVC 框架的理解,学习过程中的一些笔记,很多地方都只是个人之见 第一部分:对 AS 的理解: 关于语法: 由于 AS3 是基于 ECMAScript ,语法上看起来跟 Javascript 很像,而 OOP 部

以下是我学习Flash一周以来对AS代码的一些理解,编码击规范的一些看法和对MVC框架的理解,学习过程中的一些笔记,很多地方都只是个人之见

第一部分:对AS的理解:

关于语法:

由于AS3是基于ECMAScript,语法上看起来跟Javascript很像,而OOP部分基本上是跟JAVA一致的。所以语法上学习起来比较简单。大概的说:

1.变量声明,函数声明像javascript

2.事件处理提供了DOM3的事件模型,跟其它的WPFHTML5canvas也是基本一致的。

3.另外觉得比较有意思的是和javascript?,java,c#的一样也提供了遍历集合的语句foreach?in...?for?in....但语法各不相同。

(事件流模型)

AS3在变量类型最大的特点是类型定义很简单,基本类型只有Boolean,int,uint,Number,String,另外Object类型是所有对象的基类,在AS3中,一切皆是对象。对于JAVA,一些值类型是直接存储值,而AS3中,值类型也是存储引用,这点跟C#更像,所以AS3是一种更纯粹的面向对象语言。但是要注意的是值类型是一种不变对象,每次修改都会导致新变量的产生和旧变量的销毁,这样的优点在于减小引用消耗和支持重复引用,但修改的消耗变大。值类型包括Boolean,String

另一个很明显的特点是AS3支持的字符串,集合操作非常丰富。主要涉及到String类,Array类。像插入的三种方法:push?unshift?splice?删除的三种方法:pop?shift?splice(1,2)?;排序的三种方式:默认,排序方(array常量),排序函数;查询的几种方法:concat,join,slice,tostring等?

数组的使用,觉得有几点需要注意

1.各方法的返回值,有些返回被作用元素的索引,有些返回一个被作用元素的数组,有些返回被作用元素的个数;?

2.注意delete方法是把元素的位置设为undefined,所以数组的长度不会变。

3.在用于哈希数组时多用Dictionary类,少用Object.(ObjectKey类型只能是字符串,而DictionaryKey类型可是是对象?),当要删除某条纪录时,把相应的键设为NULL,就能被能垃圾回收。

4.掌握用ByteArray对象来进行集合深复制的方法。可以写一个叫clone的函数:

function?clone(source:Object):*

{

?????var?myBA:ByteArray=new?ByteArray();

?????myBA.writeObject(source);

?????myBA.position=0;

?????return(myBA.readObject());

}

关于类型转换:我们知道,类型转换可以是隐式的,也可以是显式的。在显式转换中,AS3没有像C#一样定义很多转换工具类(Parse类,Convert类)和JAVA把转换函数定义到类型对象的方法中,如(Integer.parseint,直接使用强制的转换方法,当强制转换不成功时设置默认值,而不是抛出异常。另外还可以用Number()?来转换看上去像浮点数的字符串。

参数传递也跟JAVA类似,可以设置默认值,传递数组参数用“...”关键字。

总的来说,AS3的在类型和类型转换的处理上都比JAVA,C#更加简洁。

关于运行机制:

AS3代码要先编译成ABC文件(字节码),放到二进制容器SWF文件中被Flash?Player运行。

AS的垃圾回收机制:AS3的垃圾回收有两种方式,一是通过引用计数器,对所有引用数为0的对象进行回收。二是标记+清理模式,从对象树的根节点开始遍历并作标记,没有被标记的对象会被回收。后者的开销更大,但可以用来解决循环引用的问题。而弱引用就是当你为某个对象创建一个引用时,该引用不会影响引用计数器的值,因此即使你不对该引用置空,对象仍然可以被回收(只要该对象身上没有任何强引用)。在AS3中有两个地方可以使用弱引用机制,一是添加监听器时,二是使用Dictionary对象。如下面的代码:

btn.addEventListener(MouseEvent.CLICK,?btnClick,?false,?0,?true;

最后一个参数表示是否采用弱引用,默认为false.采用强引用能防止被垃圾回收机制回收。实际上,提高性能最好的方法是当资源不需要时,用removeEventListener删除所以加上display?object上的监听器,再手动的删除掉之前加上去的所有display?object

删除变量:不再需要变量时,请删除变量或将变量设置为?null。这样做可以标记数据,以便进行垃圾回收。删除变量有助于在运行期间优化内存使用情况,因为从?SWF?文件中删除了不需要的资源。删除变量比将变量设置为?null?更好。


理解flash?play图的底层:

渲染机制?:理解Flash?Player的渲染和代码执行机制也是十分重要的。当你执行了改变界面的指令时,Flash?Player并不是立刻把你要的内容显示在屏幕上,它根据一定的周期来刷新屏幕,而代码的执行则是另一回事。这和Java正相反,Java总是等待程序主动告诉它什么时候重绘屏幕。

使用工具:另外,可以使用flash?player?debug版来观察页面重绘的情况,一般重绘越频繁,面积越大,性能就越差。打开显示重绘区域的功能,很容易看出当前重绘的情况。有的时候有些性能问题是觉察不出的,如被设成visible却不断重绘的DisplayObject,这时就需要借助调试工具来查看了。

关于OOPOOP是一个需要长期学习的过程,我觉得最好的方法是看设计模式,从设计模式的例子上来学习OOP

1.as3语言中,函数也可以以一种变量的方式存在,所以在类中声明实例方法也可以使用var?方法名:Fuction=function(参数){}?的方式。这样灵活的方式有利于在运行时动态的替换方法的函数体。

2.as3中没有枚举类型,我们可以利用静态属性来模拟枚举类型,静态属性和静态方法在高级的OOP设计中经常用到,比如像工厂模式,单例模式,可以利用这个特征来编码项目中的工具类,管理一些静态常量等。

3.包外类,有点类似于JAVA的内部类,只不过放置的位置不同,但要实现的东西是一样的,都是给主类调用。注意包外类是对外不可见的,因为每个as

文件编译成一个单元,而每一个单元对外只有一个类。

4.gettersetter方法。这很符合C#的语言风格,可以封装于无形,更符合客观思维。实际上,getter,setter方法可以关联多个属性,也可以一个属性都不关联,是一种非常灵活的对外访问接口。

另外像接口,抽象类,继承,重写这些概念基本上与JAVA一致。

关于核心类:

AS3开发中,有几个方面是经常用到的,如日期和时间处理,正则表达式,XML处理,显示编程,文本位图视频音频,网络通信,这些都是一门开发语言必备的功能。

日期和时间处理:Date类提供日期处理,Timer类提供计时器功能

正则表达式:与之相关的有String类的四个函数?match?replace?split?searchRegExp类的test,exec方法。AS语言的正则表达也一些自身的特色,可以在匹配字符串的后面添加一些标识字符,像指示是否忽略大小写等。

核心显示类:区分sprite类与MoveClip

Sprite?—?Sprite?对象可以包含它自己的图形,还可以包含子显示对象。(Sprite?类用于扩展?DisplayObjectContainer?类)?MovieClip?—?MovieClip?对象是在?Flash?创作工具中创建的?ActionScript?形式的影片剪辑元件。实际上,MovieClip?与?Sprite?对象类似,不同的是它还有一个时间轴。

第二部分:编码规范

AS3编码规范和JAVA基本是一致的。参照了于AS3的编码规范官方的文档:

http://blog.dclick.com.br/wp-content/uploads/adobe-flex-coding-guidelines-v12-english.pdf

提几点小意见:

1.除非声音的变量在循环中,不然局部变量应该在所属块中声明。

2.注释:对于公有调用部分,采用原文档里的方法,如果是非公用的,可以只是普通注释“//”,提高效率。

3.排版:在注释前一行应为空行

4.命名:Boolean变量最好以can?,is,has等作为前缀来命名。?????

6.保留字:

第三部分:关于MVC框架

关于MVCMVC框架的始祖是Struts,现在在Web项目开发中应用非常广,它的优点就不多说了。

问题一:AS3是否需要MVCAS开发模式有下面几个特点

1.AS3是单一语言环境,多层代码混在一起问题没那么严重。

2.AS3正常情况都是一次性编译全部代码,即使用了MVC框架还是需要一起编译。单独编译一个模块减少编译时间有别的办法,不需要依赖MVC

3.AS3本身的事件和动态特性和一些框架的功能重复。

4.AS3目前的框架还很不成熟。

由于一个项目通常不是一个完成的,在多人合作的情况下,只是单一个使用MVC框架,会使得其它项目成员的学习成本增加,协作不方便,造成不必要的麻烦,毕竟现在的AS3?MVC框架还没得到广泛认同和使用,所以我觉得应该使用纯粹的AS语句来编写项目。

实际上,MVC也只是一个软件架构的方法而已,并不一定需要一个第三方的框架来支持。框架的灵魂在于三层架构的模型图。像JAVAstruts.xwork,到后来的Stuts2Web框架,都只是架好了这个模型,并在各层之间提供一个明确统一的通道来进行通信,仿佛就是一个对象在三层之间的流动。MVC框架的的控制部分大都使用xml配置文件来实现,如struts2struts.xmlasp.net?mvcweb.config。可很有利于团队开发,例如一个struts2Web项目,架构师可以在项目设计阶段写好控制部分,通过struts.xml文件配置来对于各个ACTION请求的模型,以及对于各个请求的返回结果的跳转的视图,这样整个开发过程会极其的规范,以后也好维护。

实际上MVC应该是一种思想,而不是一定要和框架挂钩,将模型和视图的代码分开,并提出控制器的代码,然后互相调用各自方法就是一个简单的MVC架构。

如下简单例子:

var myData:String="lincoln";

var textFiled: TextField=new TextField();

public function MVCSample()

{

textFiled.addEventListener(MouseEvent.CLICK,clickHandler,false,false);

addChild(textFiled);

}

public function clickHandler(event:MouseEvent):void

{

show();

}

public function show():void 

{

this.textFiled.text=myData;

}


如果要改写成MVC模式,则类的设计大概如下:

public class M

{

public static var myData:String="lincoln";

}

public class V extends Sprite

{

var textFiled: TextField=new TextField();

public function V():void

{

this.textFiled.addEventListener(MouseEvent.CLICK,C.clickHandler);

}

public static function show():void

{

this.textFiled.text=M.myData;

}

}

public class C

{

public  static  function clickHandler(event:MouseEvent):void

{

V.show();

}

}


Model的全部引用放在固定的位置,View的引用使用静态属性储存或者用管理类管理,Controler可以作为函数或者类直接初始化并执行,亦可以通过反射。这并不需要专门的工具类来辅助,附加成本也比较小,自然就可以适用于任何规模的项目。

在众多的AS3?MVC框架中,pureMVCCairngorm是两个较早出现的框架,已经有点过时。看网上比较推荐的是Robotlegs框架,拥有了控制反转和依赖注入,包装了大部分功能,配置代码大大减少。还有一款简洁,轻量级的MVC框架,WeeMVC我测试官网的两个例子,感觉三层分得很清楚,用起来很方便。不过都只是简单了解,以后要用到再学。

AS3的学习现在还比较浅,很多重要的概念还没完全搞清楚,像异常处理,命名空间,Flash?Player的安全机制等,没写进来,AS代码量也比较少,下周再继续努力。

参考文献:

Adobe官网教程:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3_Flex/WS5b3ccc516d4fbf351e63e3d118a9b90204-7eee.html?

ActionSciprt3?API文档http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package-summary.html?

Flash.ActionScript3.殿堂之路》

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读