Flex程序从本质上讲,就是使用了(由AS编写的)Flex框架的Flash程序。
但在Flex程序中可以忽略timeline这个概念,所有的内容都集于一帧。
事实上Flex程序中的根,是继承flash.display.MovieClip的mx.managers.SystemManager。
SystemManager有两帧。第一帧是预加载程序,第二帧是主程序。
因此,所有程序在真正开始运行前,需要经过如下过程:
预初始(preinitialize)
程序在这个过程后,已经被实例化,但还未创建任何内容。
初始化(initialize)
程序在这个过程后,已创建好内容,但还未完成布局。
创建完成(creationComplete)
程序在这个过程后,已完成包括布局在内的所有创建。
在顺利完成以上3个过程后,SystemManager广播applicationComplete事件,意味着程序整装待发了。
SystemManager还管理着所有显示在前端的内容。包括弹出窗,鼠标指针,工具提示等。
SystemManager 有一个叫totelLevelSystemManager的属性。当Flex程序是一个独立程序时,该属性指向SystemManager的实例,而当 Flex程序是被加载到别的Flex程序时,该属性指向加载者的SystemManager实例。
所有UIComponents都有一个systemManager的属性,指向程序的SystemManager实例。
了解预加载器
预加载器由SystemManager在第一帧自动创建,当完成后发布complete事件,并进入第二帧,再由SystemManager删除。
除了complete以外,还有如下事件:
progress:程序下载过程
rslError:运行期共享库下载失败
rslProgress:运行期共享库下载过程
rslComplete:运行期共享库下载完成
initProgress:程序初始化过程
initComplete:程序初始化完成
在Flex程序中加载另一个Flex程序
被加载的Flex程序,在加载完毕后,自身内部会经历上述3个过程。最终,主程序才能对该程序进行有效的访问。
<!–————————————
B.mxml 生成 B.swf
————————————––>
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute”>
<mx:Script>
<![CDATA[
public function setBackground(color:Number):void {
canvas.setStyle("backgroundColor", color);
}
]]>
</mx:Script>
<mx:Canvas id=”canvas” backgroundColor=”#FFFFFF” width=”100″ height=”100″ />
</mx:Application>
<!–————————————
A.mxml 生成 A.swf 加载 B.swf
————————————––>
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute”>
<mx:Script>
<![CDATA[
import mx.managers.SystemManager;
import mx.events.FlexEvent;
private function initHandler(event:Event):void {
event.target.content.addEventListener(FlexEvent.APPLICATION_COMPLETE, applicationCompleteHandler);
}
private function applicationCompleteHandler(event:Event):void {
event.target.application.setBackground(0xFFFF00);
}
]]>
</mx:Script>
<mx:SWFLoader source=”B.swf” init=”initHandler(event)” />
</mx:Application>
了解程序作用域
当程序中牵涉到加载外部.swf程序时,了解程序作用域的概念是非常重要的。首先要了解所有的Flex/Flash程序都是由一系列类组合而成。这一系列类都维持在一个程序作用域中。当仅有一个程序在运行时,程序作用域的概念只是一个形式,因为不可能发生作用域冲突的事情。当加载额外的.swf程序后,情况就不一样了,此时,可能会发生3种情况:
被加载的.swf在现有作用域的子作用域中运行
这种情况下,被加载.swf可以使用父作用域中的所有类,而本身作用域中和父作用域中冲突的类,将被忽视。
这样子有3个好处:
减少内存的占用。
单态管理者(Singleton manager classes)可以访问父级程序,也可以访问子级程序。
从技术角度讲,在编译子级程序时,可以不用把重复的类编译进去,从而减少文件大小
但有时不能忽视子作用域的类。比如碰到类名虽然冲突,但功能却不相同时。
被加载的.swf在一个新的完全独立的作用域中运行
这种情况下,被加载.swf在一个不受任何约束的作用域中运行。虽然不会发生什么冲突,但这样会加大内存的占用。
被加载的.swf在现有作用域中运行
这种情况下,被加载.swf在现有的作用域中运行,被看作现有内容的一部分。常常用于运行期共享库。
实现上述3种情况的代码如下:
//————————————————————
// 被加载的.swf在现有作用域的子作用域中运行
//————————————————————
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
var request:URLRequest = new URLRequest(“RuntimeLoadingExample.swf“);
var loader:Loader = new Loader();
loader.load(request, context);
// 等同于
var request:URLRequest = new URLRequest(“RuntimeLoadingExample.swf“);
var loader:Loader = new Loader();
loader.load(request);
//————————————————————
// 被加载的.swf在一个新的完全独立的作用域中运行
//————————————————————
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain();
var request:URLRequest = new URLRequest(“RuntimeLoadingExample.swf“);
var loader:Loader = new Loader();
loader.load(request, context);
//————————————————————
// 被加载的.swf在现有作用域中运行
//————————————————————
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
var request:URLRequest = new URLRequest(“RuntimeLoadingExample.swf“);
var loader:Loader = new Loader();
loader.load(request, context);
loadContext
ApplicationDomainFlash Player和Flex框架的不同
Flash Player是Flash/Flex程序的运行环境。它用来运行.swf文件,完成加载图片,绘制图像,请求HTTP等之类的操作。Flash/Flex程序只能做Flash Player能够做的事情。
Flex程序就是Flash程序,Flash不能做的事情,Flex一样不能做。所以程序包含的只不过是具体指令,而Flash Player则是运行指令。Flash程序和Flex程序在内容上没有不同,只是在创建内容时不同。
Flex的编译器可以编译MXML和AS。由AS和MXML编写的Flex框架抽象出一个更高级的层面。这些都能在Flash Player中运行。
改善的是开发速度。
负面影响则是增加了.swf的大小。因为Flex框架是要被具体编译到.swf里面的,而不像Flash Player API已经集成在Flash Player内部了
本文来源于 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址:http://xinsync.xju.edu.cn/index.php/archives/1605
分享到:
相关推荐
通过这些基本原理,开发者能够理解Flex框架如何组织和控制应用程序的运行,从而更好地利用其强大的功能来构建复杂的用户界面和业务逻辑。Flex框架提供了一套完善的组件库,支持数据绑定,使得开发RIA变得更加便捷和...
Flex 原理 当你编译一个 Flash 程序时,Flash 开发环境把所有的可视化元素,时间轴指令和 ActionScript 中的业务逻辑编译为 SWF 文件。 同样地,Flex 程序中的 MXML 和 ActionScript 代码首先全部被转换为 ...
《编译原理——深入理解FLEX与BISON》 编译原理是一门深入探讨计算机语言翻译过程的学科,它涉及到词法分析、语法分析、语义分析等多个阶段。在实际编程工作中,FLEX和BISON是两个常用的工具,用于实现编译器的词法...
在编译原理的学习和实践中,掌握Flex的使用是至关重要的。 Flex主要负责识别源代码中的词汇结构,将其转化为符号供语法分析阶段使用。它基于正则表达式来定义词法规则,通过flex工具,我们可以编写lex.y文件(通常...
flex原理和全属性详解flex 是 flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局
Flex工具包是编译原理学习和实践中不可或缺的一部分,主要用于创建词法分析器(lexer)或扫描器。在编译器设计领域,词法分析是编译过程的第一步,它将源代码分解成一个个称为标记(token)的独立单元,这些标记随后...
#### 六、Flex原理 Flex程序中的MXML和ActionScript代码会被转换为ActionScript,然后编译成SWF文件。SWF文件被部署到服务器上后,用户可以从服务器获取并运行这些程序。 #### 七、Flex应用构建形式 主流的Flex...
【编译原理flex.exe工具包】是一个专门为学习和实践编译原理而设计的软件包,主要包含flex.exe这个工具。flex,全称是Fast Lexical Analyzer Generator,它是一个用于生成词法分析器(lexer)的开源工具。在编译原理...
通过理解这些原理,开发者可以更好地利用Flex的数据绑定功能,创建出响应迅速且易于维护的用户界面。同时,需要注意的是,过度使用数据绑定可能会增加内存占用和运行时开销,因此在设计时需要权衡其使用。
总之,通过这个“编译原理实验MiniPascal编译器设计 Flex+Bison”项目,学习者将深入理解编译器的工作流程,掌握词法分析和语法分析的关键技术,并具备实际动手实现一个小型编译器的能力。这对于提升编程技能和深入...
《自顶向下Flex程序解析与编译原理探析》 在计算机科学领域,编译器是连接高级语言和机器语言的桥梁,而Flex则是构建词法分析器的工具,广泛应用于编译器和解释器的开发。本篇将深入探讨“自顶向下”的Flex程序设计...
### Flex技术:从历史到现代应用的深度解析 #### RIA技术:富互联网应用程序的崛起 Flex技术,作为RIA(Rich Internet Applications,富互联网应用程序)的一员,代表着企业级应用程序发展的新阶段。RIA技术的出现...
在深入探讨`flex`编译原理以及如何模拟计数器之前,我们首先需要理解什么是`flex`。`flex`(以前称为`lex`)是一种词法分析器生成器,用于处理源代码中的文本模式匹配。它接收一个用特定语法描述的输入文件(通常...
Flex的工作原理基于正则表达式,它可以帮助开发者定义一系列规则,用于识别源代码中的关键字、常量、标识符等。 在Windows下使用flex,首先需要下载并安装flex的可执行文件。压缩包中可能包含了预编译的版本,或者...
编译原理课程中的flex和yacc 这是flex的安装程序
编译原理实验——flex词法分析 flex源程序
通过这个入门实例,开发者可以快速理解Flex与Java交互的基本原理,并为进一步的复杂项目开发奠定基础。在实际的企业级应用中,这种交互模式常用于构建用户友好的前端界面,同时利用Java的强大后端处理能力,实现数据...
本次资源就是针对一次编译原理实验,实验的内容就是用flex工具自动构造词法分析程序
《flex&bison:Windows平台下的编译原理实践指南》 在编程世界中,编译器扮演着至关重要的角色,它将我们所写的高级语言转化为机器可以理解的指令。而编译器的设计与实现,离不开两个核心工具:flex和bison。本教程...