- 浏览: 200188 次
- 性别:
- 来自: 上海
最新评论
-
zhuzhuaijq:
Flash OBJECT和EMBED标签详解 -
matt.u:
好像有点深奥。
一篇比较好演示AS的重构方法 -
luofeng113:
分析得不错,
flex编程感受 -
felixsky:
请问flexunit如何测试private和internal的 ...
FLEXUnit应用 -
wv1124:
你不能分个页啊,看得人都要死了
Apollo: 开发者问答录
Flash有着天生非凡的动画和交互能力, 在RIA (富互联网应用程序)中有着天生的优势. 有些时候, flash客户端之间, 以及与其他客户程序如javascript (js)需要进行交互, 以提供更好的用户体验. 本文将对当前常用的多种flash客户端相关的交互方式进行归纳, 这些交互与服务器端无关.
Flash中使用的是actionscript (as)脚本, as脚本是一门基于ECMAScript的脚本语言, 在AVM(ActionScript Virtual Machine)上执行, 目前AVM分为AVM1和AVM2. 另一个著名的基于ECMAScript语言是javascript, 所以两者有很多共同特性. 不妨先来看一下as的发展历程:
as1: 2000年5月, 出现在flash player 5, 是一门弱类型, 基于prototype继承基制的语言, 这点和目前的js是一样的.
as2: 2003年9月, 出现在flash player 7, 支持编译时类型检查, 支持基于class继续的语法(实质上只是在已存在的基于prototype继承基制上增加了一层). 能够编译为as1的字节码, 所以与AS1是兼容的.
as3: 2006年6月, 出现在flash player 9, 随Adobe Flex 2一起发布. 它是AS的一次完全重构, 已经成为完全的面向对象的语言, 与as1/as2不再兼容, 运行于一个全新的虚拟机AVM2, 随之as1/as2运行的虚拟机被称为AVM1. as3的重新设计主要包括语言核心和flash player API两部分, 具体可查阅官方文档或wikipedia. flash player 9同时包含AVM1和AVM2, 所以它支持三个as版本的flash, 只是会使用不同的虚拟机去运行它们.
下面切入主题, 分析一下flash客户端间的交互.
Flash中实现页面跳转
在flash中, actionscript 2 (as2)脚本可以通过getUrl发送一个url请求, 而actionscript 3 (as3)以flash.net.navigateToURL代替. navigateToURL在某些浏览器(比如firefox, ie 7等)下, 会被当弹出窗口拦截, 可以对特定的浏览器用ExternalInterface.call(window.open, url, “_blank”, “”)代替, 这实际上是在调用javascript函数.
另flash判断用户使用的浏览器, 也可以通过调用js实现, 如ExternalInterface.call(”function getBrowser(){return navigator.userAgent;}”).
Flash与Javascript交互
在flash player 8之前(不包括8), flash使用fscommand与js交互. 之后被ExternalInterface取代, 可见as2和as3都支持ExtenalInterface. ExternalInterface.call可以调用js代码, ExternalInterface.addCallBack可注册as2/as3函数供js调用. 在as3中, ExternalInterface位于包flash.external中.
ExternalInterface需要一个条件: “The ExternalInterface class requires the user’s web browser to support either ActiveX® or the NPRuntime API that is exposed by some browsers for plug-in scripting”.
注意在js中调用as函数, 取swf的引用时, ie6/7使用object的id, firefox使用embed的id.
Flash跨虚拟机的交互
Flash跨虚拟机, 指的得两个flash运行于两个不同的虚拟机(AVM1, AVM2), 如在不同的flash player/AIR中运行的flash, 或者如一个as3的swf加载了一个as2的swf, 这在flex 3.2之后可用mx.controls.SWFLoader实现, 等等. 跨虚拟机交互从as语言角度来说, 就是as3与as1/as2的交互. 这种交互主要有三种选择方案:
1. LocalConnection
先引用一段官方文档上有关LocalConnection的描述:
“Local connections enable this kind of communication between SWF files without the use of fscommand() or JavaScript. LocalConnection objects can communicate only among files that are running on the same client computer, but they can be running in different applications — for example, a file running in a browser and a SWF file running in Adobe AIR.
LocalConnection objects created in ActionScript 3.0 can communicate with LocalConnection objects created in ActionScript 1.0 or 2.0. The reverse is also true: LocalConnection objects created in ActionScript 1.0 or 2.0 can communicate with LocalConnection objects created in ActionScript 3.0. Flash Player handles this communication between LocalConnection objects of different versions automatically.”
LocalConnection提供了虚拟机间的通信通道, 实现在不同的客户端实现通信. 不过这个特性也可能成为缺点. 比如一个页面上多个flash使用LocalConnection进行通讯, 如果打开多个这样的页面, 如果标志LocalConnection的字符串相同, 这些页面可能会互相干扰. 解决的办法是为每一个LocalConnection提供唯一的标志字符串, 类似于id, 并且保证打开多个同样的页面, 这个标志字符串仍然是唯一的. 或许可以考虑把当前时间加入到标志字符串中保证唯一性.
另外, 有一个开源的库SWFBridge可以方便LocalConnection的开发.
2. 以javascript为桥梁通讯
当多个swf位于同一个页面, 或者, 一个swf加载了另一个swf, 并且, 它们所在环境支持使用ExternalInterface进行flash与js的交互, 就可以以js为桥梁实现flash客户端的交互.
同样, 有一个开源库flashinterface可以方便该开发, 既可以调用, 也可以基于事件通信.
注意, 使用flashinterface时, 要在程序开始时先调用
FlashInterface.publish(this, true);
否则可能会出错. 如flex application里, 可以在Application initialize事件中调用.
3. 使用SharedObject传递数据
SharedObject类似于cookie, 可以保存flash客户端的数据, 自然也能用它来实现多个swf之间传递数据. 如有人就用此种方式实现了一把.
不过这种方式, 如同cookie一样, 可能会受到安全机制的限制, 另外也不够灵活.
同一虚拟机中多个swf的交互
同一虚拟机多个swf的交互, 典型的例子如Flex 3.2使用SWFLoader加载了一个as3的flash, 此时, 两个swf都运行于AVM2. 这种情况下的交互支持上文提到的虚拟机间交互的所有方式, 不过更方便的是直接调用或使用事件.
如下面的例子, flex程序使用SWFLoader加载了一个as3 swf:
<mx:SWFLoader id=”myloader” source=”test.swf” creationComplete=”onSwfLoaded(event)”/>
直接调用时, 可以传任何参数和返回值, 如
父swf调用子swf, 直接这样调用: MovieClip(myloader.content).doTest();
doTest是子swf的一个函数.
子swf调用父swf, 可以在SWFLoade的creationComplete响应中, 先把this传给子swf, 子swf就可以调父的方法了. 如该博客中的例子(我试过可行).
用事件通信时, 可以直接在子swf中this.dispatchEvent(new flash.events.Event(”abcd”));
再在父中加入MovieClip(myloader.content).addEventListener(”abcd”, onAbcd);
或者, 在子swf中调用父的dispatchEvent, 在父中this.addEventListener.
Flash客户端间基本交互和解决方案主要就是这些, 它们各有所长, 具体选择哪一种就要看应用环境了.
Flash中使用的是actionscript (as)脚本, as脚本是一门基于ECMAScript的脚本语言, 在AVM(ActionScript Virtual Machine)上执行, 目前AVM分为AVM1和AVM2. 另一个著名的基于ECMAScript语言是javascript, 所以两者有很多共同特性. 不妨先来看一下as的发展历程:
as1: 2000年5月, 出现在flash player 5, 是一门弱类型, 基于prototype继承基制的语言, 这点和目前的js是一样的.
as2: 2003年9月, 出现在flash player 7, 支持编译时类型检查, 支持基于class继续的语法(实质上只是在已存在的基于prototype继承基制上增加了一层). 能够编译为as1的字节码, 所以与AS1是兼容的.
as3: 2006年6月, 出现在flash player 9, 随Adobe Flex 2一起发布. 它是AS的一次完全重构, 已经成为完全的面向对象的语言, 与as1/as2不再兼容, 运行于一个全新的虚拟机AVM2, 随之as1/as2运行的虚拟机被称为AVM1. as3的重新设计主要包括语言核心和flash player API两部分, 具体可查阅官方文档或wikipedia. flash player 9同时包含AVM1和AVM2, 所以它支持三个as版本的flash, 只是会使用不同的虚拟机去运行它们.
下面切入主题, 分析一下flash客户端间的交互.
Flash中实现页面跳转
在flash中, actionscript 2 (as2)脚本可以通过getUrl发送一个url请求, 而actionscript 3 (as3)以flash.net.navigateToURL代替. navigateToURL在某些浏览器(比如firefox, ie 7等)下, 会被当弹出窗口拦截, 可以对特定的浏览器用ExternalInterface.call(window.open, url, “_blank”, “”)代替, 这实际上是在调用javascript函数.
另flash判断用户使用的浏览器, 也可以通过调用js实现, 如ExternalInterface.call(”function getBrowser(){return navigator.userAgent;}”).
Flash与Javascript交互
在flash player 8之前(不包括8), flash使用fscommand与js交互. 之后被ExternalInterface取代, 可见as2和as3都支持ExtenalInterface. ExternalInterface.call可以调用js代码, ExternalInterface.addCallBack可注册as2/as3函数供js调用. 在as3中, ExternalInterface位于包flash.external中.
ExternalInterface需要一个条件: “The ExternalInterface class requires the user’s web browser to support either ActiveX® or the NPRuntime API that is exposed by some browsers for plug-in scripting”.
注意在js中调用as函数, 取swf的引用时, ie6/7使用object的id, firefox使用embed的id.
Flash跨虚拟机的交互
Flash跨虚拟机, 指的得两个flash运行于两个不同的虚拟机(AVM1, AVM2), 如在不同的flash player/AIR中运行的flash, 或者如一个as3的swf加载了一个as2的swf, 这在flex 3.2之后可用mx.controls.SWFLoader实现, 等等. 跨虚拟机交互从as语言角度来说, 就是as3与as1/as2的交互. 这种交互主要有三种选择方案:
1. LocalConnection
先引用一段官方文档上有关LocalConnection的描述:
“Local connections enable this kind of communication between SWF files without the use of fscommand() or JavaScript. LocalConnection objects can communicate only among files that are running on the same client computer, but they can be running in different applications — for example, a file running in a browser and a SWF file running in Adobe AIR.
LocalConnection objects created in ActionScript 3.0 can communicate with LocalConnection objects created in ActionScript 1.0 or 2.0. The reverse is also true: LocalConnection objects created in ActionScript 1.0 or 2.0 can communicate with LocalConnection objects created in ActionScript 3.0. Flash Player handles this communication between LocalConnection objects of different versions automatically.”
LocalConnection提供了虚拟机间的通信通道, 实现在不同的客户端实现通信. 不过这个特性也可能成为缺点. 比如一个页面上多个flash使用LocalConnection进行通讯, 如果打开多个这样的页面, 如果标志LocalConnection的字符串相同, 这些页面可能会互相干扰. 解决的办法是为每一个LocalConnection提供唯一的标志字符串, 类似于id, 并且保证打开多个同样的页面, 这个标志字符串仍然是唯一的. 或许可以考虑把当前时间加入到标志字符串中保证唯一性.
另外, 有一个开源的库SWFBridge可以方便LocalConnection的开发.
2. 以javascript为桥梁通讯
当多个swf位于同一个页面, 或者, 一个swf加载了另一个swf, 并且, 它们所在环境支持使用ExternalInterface进行flash与js的交互, 就可以以js为桥梁实现flash客户端的交互.
同样, 有一个开源库flashinterface可以方便该开发, 既可以调用, 也可以基于事件通信.
注意, 使用flashinterface时, 要在程序开始时先调用
FlashInterface.publish(this, true);
否则可能会出错. 如flex application里, 可以在Application initialize事件中调用.
3. 使用SharedObject传递数据
SharedObject类似于cookie, 可以保存flash客户端的数据, 自然也能用它来实现多个swf之间传递数据. 如有人就用此种方式实现了一把.
不过这种方式, 如同cookie一样, 可能会受到安全机制的限制, 另外也不够灵活.
同一虚拟机中多个swf的交互
同一虚拟机多个swf的交互, 典型的例子如Flex 3.2使用SWFLoader加载了一个as3的flash, 此时, 两个swf都运行于AVM2. 这种情况下的交互支持上文提到的虚拟机间交互的所有方式, 不过更方便的是直接调用或使用事件.
如下面的例子, flex程序使用SWFLoader加载了一个as3 swf:
<mx:SWFLoader id=”myloader” source=”test.swf” creationComplete=”onSwfLoaded(event)”/>
直接调用时, 可以传任何参数和返回值, 如
父swf调用子swf, 直接这样调用: MovieClip(myloader.content).doTest();
doTest是子swf的一个函数.
子swf调用父swf, 可以在SWFLoade的creationComplete响应中, 先把this传给子swf, 子swf就可以调父的方法了. 如该博客中的例子(我试过可行).
用事件通信时, 可以直接在子swf中this.dispatchEvent(new flash.events.Event(”abcd”));
再在父中加入MovieClip(myloader.content).addEventListener(”abcd”, onAbcd);
或者, 在子swf中调用父的dispatchEvent, 在父中this.addEventListener.
Flash客户端间基本交互和解决方案主要就是这些, 它们各有所长, 具体选择哪一种就要看应用环境了.
发表评论
-
pv3d学习资料
2009-08-13 14:54 1863官方网站 http://www.papervision3d.c ... -
ItemRenderer的用法
2009-01-14 13:59 1807项目渲染器(ItemRenderer ... -
Flex3组件拖放教程
2008-08-27 16:27 2488关于组件拖放 可视化的开发环境就是要允许用户能够在屏幕中通过鼠 ... -
基于MVC的Flex framework比较
2008-08-13 10:13 1588关键字: mvc framework 原文出处:[url]h ... -
色彩模式(RGB、CMYK、HSB、Lab、Duotone等)
2008-08-05 13:10 3782色彩是一门很深的学问,每种色彩都有自己的特点和原理。设计师要在 ... -
colormatrixFilter
2008-07-31 12:38 1134http://hi.baidu.com/fmz1206/blo ... -
使用BlazeDS实现Java和Flex通信
2008-06-16 09:21 1048http://blog.chinaunix.net/u/216 ... -
amf是什么东东
2008-06-12 16:59 1347今天我们开发的 J2EE 网 ... -
Flash特效制作常用的源代码大放送
2008-06-06 16:02 1090对象数组 比如要构建一个有很多属性的数组,简单的可以这样 ... -
编写时间轴代码代码规范
2008-06-06 15:34 1158For any major project, you co ... -
关于ApplicationDomain的一些理解
2008-06-05 17:07 2859应用程序域: 允许跨域加载swf后,还可能出现加载的swf中的 ... -
Flash OBJECT和EMBED标签详解
2008-06-05 17:03 31108Flash OBJECT和EMBED标签 一 ... -
flex的一些项目
2008-06-03 14:48 1317一些Flex开源项目的整理 Adobe APIs 主要包 ... -
flex模式(转载)
2008-06-03 14:28 1528[url] http://www.awflasher.com/ ... -
programming Flex2 学习笔记-第5章-框架基础.txt (转载的,来自)
2008-05-29 10:40 1265来自http://blog.chinaunix.net ... -
给DataGrid设置背景色(汇总)
2008-05-27 16:49 5035DataGrid颜色专题 在Flex运用中经常提到的有关 ... -
通过ApplicationDomain类获得被加载应用程序域
2008-05-27 13:32 1637首先先回顾一下FLASH的OO ... -
一些Flex / Flash开源项目
2008-05-09 14:26 1543Adobe APIs 主要包含corelib, ... -
这几个网站是我经常去的,做开发时可以参考
2008-05-09 14:14 1399http://www.flashas.net/ http:// ... -
108种Flash常见问题解答(收藏别的:站名:http://www.flashas.net/)
2008-05-09 14:09 24221. 论坛上常说的MC、FS、 ...
相关推荐
在IT行业中,尤其是在流媒体应用开发中,Red5服务器和Flash客户端的交互是常见的技术需求。Red5是一个开源的流媒体服务器,它支持多种协议,如RTMP(Real-Time Messaging Protocol),可以用来实时传输音频、视频等...
本主题聚焦于如何在使用SuperMap iClient for Flash客户端时,结合REST地图服务并利用5.0版本的预缓存功能来提升性能和用户体验。 首先,我们要理解SuperMap iClient for Flash。这是一个基于Adobe Flash技术的GIS...
本话题主要聚焦于如何利用SuperMap iClient for Flash客户端来通过几何点集提取等值线。等值线,也称为等高线或等值面,是连接相同数值点的曲线,常用于地图上表示地形、气候等地理特征,或者在科学图表中展示数据...
在本案例中,我们关注的是"Flash与.NET交互",这是一个让客户端(通常是Web浏览器中的Flash组件)与服务器端(基于.NET框架的应用程序)进行数据交换的技术。这样的交互允许动态内容的创建,提供了丰富的用户界面和...
通过掌握以上知识,开发者可以有效地在SuperMap iClient for Flash客户端中实现Element元素的左上角参照定位,从而创建出满足需求的交互式GIS应用。在实际项目中,还需要结合具体的业务场景,灵活运用这些技术,提升...
这种方式下,Flash作为一个客户端控件,与C#组件进行交互。 2. **Interop Assembly:** C#可以通过创建Interop Assembly(互操作程序集)来调用ActiveX控件,而Flash可以作为ActiveX控件嵌入到C#应用中。这样,C#...
《深入解析Flash游戏网络模块源码:服务器与客户端的交互机制》 在互联网技术日新月异的今天,Flash游戏以其轻便、易用的特点,曾经风靡一时,尤其是在网络游戏领域。本文将深入剖析“Flash游戏网络模块源码”,...
本主题聚焦于如何利用该库在Flash客户端上自定义圆心和半径来画圆,这对于实现地理分析、空间查询或者用户交互功能具有重要意义。 首先,我们需要理解SuperMap iClient for Flash的基本概念。它是由SuperMap公司...
本文将深入探讨如何在SuperMap iClient for Flash客户端中结合自定义WMTS(Web Map Tile Service)服务以及5.0版本的预缓存功能,以提升地图服务的性能和用户体验。 WMTS是一种OGC(开放地理空间联盟)标准,用于...
1. **Socket通信**:C#可以通过System.Net.Sockets命名空间中的Socket类创建服务器端,Flash使用AS3的Socket类作为客户端,两者通过TCP/IP协议进行双向数据传输。这种方式适用于实时性要求较高的应用,如在线游戏。 ...
本资源"Flash与C#交互全集(bs与cs)"提供了全面的指导,涵盖了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构下的交互方式。 首先,让我们了解一下B/S架构。在B/S模式下,Flash作为浏览器中的客户端组件,与...
本项目“Flash和jsp,Flash和Java交互的web project”旨在演示和实现这些技术间的协同工作,为用户提供更丰富的交互体验。 Flash是一种由Adobe公司开发的多媒体创作工具,它用于创建动画、图形、视频以及交互式内容...
JavaScript是一种轻量级的脚本语言,常用于网页的动态效果和用户交互,其运行在客户端浏览器中。而Flash则是一种用于创建动画、图形和交互式内容的平台,它能够提供丰富的媒体体验,但需要用户安装Flash Player插件...
本主题将深入探讨如何在SuperMap iClient Flash客户端中进行几何点集的插值分析,这是一种重要的空间数据分析技术,用于预测未知点的属性值。 一、SuperMap iClient Flash客户端简介 SuperMap iClient Flash是...
在SuperMap iClient for Flash客户端中,提取点数据集的等值线并显示等值线的值是一项重要的地理信息系统(GIS)操作。等值线分析是GIS中的经典方法,用于将空间分布的连续变量(如地形高度、温度、降雨量等)转化为...
存在一些库,如BlazeDS和LCDS,允许Java服务器与Flash客户端之间使用AMF进行通信。 3. **安全考虑**: - 由于Flash的安全沙箱机制,跨域通信需要设置正确的策略文件,确保Flash内容可以与指定的Java服务器通信。 ...
在IT行业中,SuperMap iClient是一款广泛应用于地理信息系统(GIS)开发的软件开发工具包(SDK),它提供了多种客户端平台的支持,包括Flash版本。本文将深入探讨如何利用SuperMap iClient for Flash实现栅格专题图...
在Flash与数据库交互的过程中,XML文件通常作为数据载体,由服务器端生成并通过URL提供给客户端。 - **生成XML文件**:服务器端程序(如Servlet)可以通过JDBC查询数据库并将结果格式化为XML文件。 ##### 4. ...
在IT领域,尤其是在Web开发中,Flash和PHP的交互是一个常见的需求,特别是在创建动态和交互式的网页内容时。本文将详细探讨如何通过Flash与PHP进行参数传递,以便在客户端和服务器端之间实现数据交换。 首先,理解...
- **状态管理**:如果需要保持用户会话状态,如登录信息,需要在服务器端实现会话管理,并确保Flash客户端能正确识别和使用这些状态。 - **异常处理**:良好的错误处理机制是必不可少的,确保在数据交互过程中遇到...