Programming Flex2 - 五.Flex框架的基本原理

翻译 2007年09月16日 16:44:00
了解Flex程序的生命周期

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
ApplicationDomain

Flash 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内部了。

Programming Flex2 - 二.通过Flex框架建立应用程序

创建项目一个Flex程序最少由一个文件或多达数以百计的文件组成。文件类型如下:MXML    这种文件主要包含程序的可视部分,即样式设计和UI组件。ActionScript类    这种文件是所有自定...
  • holybozo
  • holybozo
  • 2007年09月03日 22:41
  • 1547

flex注册页面

  • yaerfeng
  • yaerfeng
  • 2011年11月11日 11:03
  • 1376

flex登录界面实例2

  • zmhinzaghi
  • zmhinzaghi
  • 2011年10月18日 15:00
  • 5449

Flex 2.0.1即将发布

Flex2.0.1马上就要发布了,这里先做了介绍 Flex team在休息之前也做了说明 这里是官方发布声明 这里是Flex2的更新页面 这次更新虽然是0.01的更新,但是绝对可以说是很大的更新,主要...
  • lwz7512
  • lwz7512
  • 2007年01月06日 16:40
  • 1412

Flex客户端用户登陆验证

开始用AS3做东西了,所以整理点东西放出来,会逐渐丰富起来的.这个其实只是很简单的应用啦.用一些组件和一个函数,暂时没有和其他程序交互下面是代码:http://www.adobe.com/2006/m...
  • sujun10
  • sujun10
  • 2007年06月07日 09:17
  • 2826

flex 3 combobox 实现关键字过滤搜索-代码示例

http://ns.adobe.com/mxml/2009"       xmlns:s="library://ns.adobe.com/flex/spark"       xmlns:mx=...
  • kkkloveyou
  • kkkloveyou
  • 2012年07月11日 16:42
  • 3417

很漂亮的Flex 用户登录界面

Java代码   "1.0" encoding="utf-8"?>  "http://www.adobe.com/2006/mxml" layout="absolute" backg...
  • xygg0801
  • xygg0801
  • 2016年11月24日 17:59
  • 537

Flex框架的基本原理 [转]

Flex框架的基本原理 Flex/Flash, Flex2, Flex3 GgNET 02月 19th. 2008, 1:10am Flex程序从本质上讲,就是使用了(由AS编写的)Flex框架的Fl...
  • sun11086
  • sun11086
  • 2009年01月05日 17:44
  • 798

Programming Flex2 - 三.MXML

MXML相当于是Flex在Flash Player上的HTML。从名字上能看出其为一个XML文档。所有的MXML文档分成两种类型。一种是主程序文档,一种是组件文档。主程序文档的根节点必然是,而组件文档...
  • holybozo
  • holybozo
  • 2007年09月09日 18:28
  • 963

自制Flex开发框架NanoUI

http://www.iteye.com/topic/1054664   虽然我并不是 很了解,留下来以后研究。   1.    NanoUI概述 1.1.    NanoUI的设计目标   ...
  • wkwanglei
  • wkwanglei
  • 2012年12月17日 14:12
  • 5152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Programming Flex2 - 五.Flex框架的基本原理
举报原因:
原因补充:

(最多只允许输入30个字)