ActionScript 3 Cookbook 中文版 第三章. 运行时环境

第三章. 运行时环境

第 1 页 共 17 页
第三章. 运行时环境
3.0.简介
3.1.检测播放器版本
3.2.检测操作系统
3.3.检测播放器类型
3.4.检测系统语言
3.5.检测显示设置
3.6.缩放影片
3.7.改变对齐方式
3.8.隐藏Flash播放器的菜单项
3.9.检测设备音频
3.10.检测设备视频
3.11.提示用户改变播放器设置
3.12.处理系统安全
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 2 页 共 17 页
3.0. 简介
Flash Player 9 关于控制运行时环境提供了更多的信。The flash.system.Capabilities 类有许多静态
方法返回关于播放器和计算机的信息,比如操作系统,语言,音频和视频。还有其他的类如
flash.display.Stage 和 flash.system.Security 控制其他一些元素如播放器右键菜单和设置对话框。
flash.display.Stage 类也控制影片剪辑缩放和对齐。
Flash Player 9 可能是自 Flash Player 7 之后最具重要意义的一次升级。它比以往提供了更多能力
控制上下文菜单。在Flash Player 7里,用 ContextMenu 类,可以控制右键菜单,可以添加或删
除菜单项。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 3 页 共 17 页
3.1. 检测播放器版本
问题
我要确定客户机上的Flash播放器版本
解决办法
可以使用Flash Player 检测工具。
( http://www.adobe.com/software/flashplayer/download/detection_kit).
讨论
检测客户机上的Flash版本是个多年以来的难题,有各种开发者提供的方法,一般有三种方法:
基于浏览器脚本检测
服务端检测
ActionScript 检测
第一种方法使用JavaScript 或 VBScript 检测Flash 播放器版本。但是很多脚本在不同的平台不同
的浏览器上会有兼容性问题出现。
服务端检测也有局限性,如果你无权限创建服务端脚本,这就很困难了。
大多基于 ActionScript 的检测技术不能在ActionScript 3.0 上用了。 ActionScript 3.0 有一套自己
的检测客户端版本的方法,那就是 flash.system.Capabilities.version 属性。但是它不能检测Flash
Player 8.5 之前的版本。
还好Adobe 已经考虑到所有这些问题,推出了 Flash Player Detection Kit 来指导你用最好的办法
检测播放器版本。
检测包里包含文档和各种解决办法,包括VBScript 和 JavaScript 例子;ActionScript 检测;还有
服务端的 ColdFusion 和 PHP 脚本检测。
基于ActionScript 的检测是比较好的,它可以支持到Flash 播放器4,它使用一个 Flash 4 .swf t
来检测当前版本,你所要做的就是在脚本里设置最小的版本变量,如果当前版本高,它会调用指定
的内容。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 4 页 共 17 页
3.2. 检测操作系统
问题
我要知道客户端的操作系统。
解决办法
使用flash.system.Capabilities.os 属性
讨论
ActionScript 3.0中,flash.system.Capabilities.os 属性返回操作系统名称和版本字符串。值可能包
括Windows XP, Windows 2000, Windows NT, Windows 98/Me, Windows 95, 和 Windows CE. 在
苹果机上,字符串包括版本号,比如 Mac OS 9.2.1 或 Mac OS X 10.4.4.
你可能基于操作系统做一些特殊处理,比如,根据当前系统载入特定的图标,或只是记录下用户的
操作系统来统计。
下面的代码展示检测操作系统:
var os:String = System.capabilities.os.substr(0, 3);
if (os == "Win") {
// Windows-specific code goes here
} else if (os == "Mac") {
// Mac-specific code goes here
} else {
// Must be Unix or Linux
}
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 5 页 共 17 页
3.3. 检测播放器类型
问题
我想知道播放器类型You want to know what type of Flash Player the .swf is being run from.
解决办法
使用 flash.system.Capabilities.playerType 属性.
讨论
播放器的类型有:
浏览器插件形式存在于 Mozilla 或 Firefox
ActiveX 控件形式存在于Internet Explorer
独立播放器
外部播放器,它与Flash IDE 进行交互。
这些都是.swf 运行的环境,如果你要使用脚本进行交互,这就需要知道应用程序到底在Internet
Explorer 或其他的浏览器运行。如果在独立播放器里运行,那么JavaScript等脚本就不管用了。
检测播放器类型,察看flash.system.Capabilities.playerType 的值。
它可能是PlugIn, ActiveX, StandAlone, 和 External:
if(flash.system.Capabilities.playerType == "Plugin") {
// do actions for Mozilla, etc. browsers
}
else if(flash.system.Capabilities.playerType == "ActiveX") {
// do actions for IE
}
else {
// do actions for no browser
}
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 6 页 共 17 页
3.4. 检测系统语言
问题
我想知道客户端系统使用什么语言和输入法
解决办法
使用 flash.system.Capabilities.language 属性和 flash.system.IME 类
讨论
flash.system.Capabilities.language 属性给出客户端系统的语言,返回两个 ISO-639-1 字符(如
"fr" 代表 French). 有些国家代码两个字符是不合适的,比如( "zh-CN" 代表 Simplified Chinese 和
"zh-TW" 代表 Traditional Chinese).
下面的代码展示如何使用语言属性:
// Example output: en-US
trace(flash.system.Capabilities.language);
var greetings:Array = new Array( );
greetings["en"] = "Hello";
greetings["es"] = "Hola";
greetings["fr"] = "Bonjour";
var lang:String = flash.system.Capabilities.language.substr(0, 2);
if (greetings[lang] == undefined) {
lang = "en";
}
trace(greetings[lang]);
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 7 页 共 17 页
如果要创建国际化的Flash,可以把文本保存在数组里,根据语言动态显示,或者直接做成多个Flash
版本(每个语言一个),如 myMovie_en.swf, myMovie_es.swf, myMovie_fr.swf, 等.
//从 capabilities 对象上得到语言值
var lang:String = System.capabilities.language.substr(0, 2);
// 创建支持语言数组
var supportedLanguages:Array = ["en", "es", "fr"];
// 设置默认语言.
var useLang:String = "en";
//循环匹配,如果找到,设置 useLang
for (var i:int = 0; i < supportedLanguages.length; i++) {
if (supportedLanguages[i] == lang) {
useLang = lang;
break;
}
}
// 载入对应Flash
var movieURL:String = "myMovie_" + useLang + ".swf");
还有一点也很重要,比如用户使用的输入语言,比如中文,日文,韩文,输入这些字符需要输入法,
这时特定操作系统的一部分。
flash.system.Capabilities.hasIME 返回用户是否使用输入法. flash.system.IME 类返回关于输入法
的信息。flash.system.IME.enabled 属性设置用户是否可以使用输入法。在有些操作系统和版本上
你可以发送字符串给IME来转换成正确的字符,接受IME 的返回,但这不是所有操作系统都支持的,
最好检测下先。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 8 页 共 17 页
3.5. 检测显示设置
问题
我要知道客户机的显示设置情况
解决办法
使用 system.capabilities 对象的 screenResolutionX 和 screenResolutionY 属性
讨论
screenResolutionX 和 screenResolutionY 属性返回桌面的显示分辨率:
trace(flash.system.Capabilities.screenResolutionX);
trace(flash.system.Capabilities.screenResolutionY);
// 1024
// 768
有了这些值,你可以决定怎样显示flash影片。这一点对于Flash播放器也是很重要的,例如,手机
屏幕和电脑屏幕尺寸是不同的,因此你要根据情况载入不同的尺寸的内容。
var resX:int = flash.system.Capabilities.screenResolutionX;
var resY:int = flash.system.Capabilities.screenResolutionY;
if ( (resX <= 240) && (resY <= 320) ) {
var  url:String = "main_pocketPC.swf";
}
else {
var  url:String = "main_desktop.swf";
}
loader.load(new URLRequest(url));
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 9 页 共 17 页
利用分辨率还可以居中你的弹出窗口:
var resX:int = flash.system.Capabilities.screenResolutionX;
var resY:int = flash.system.Capabilities.screenResolutionY;
//设置窗口的宽和高
var winW:int = 200;
var winH:int = 200;
// 设置窗口起始坐标
var winX:int = (resX / 2) - (winW / 2);
var winY:int = (resY / 2) - (winH / 2);
// 创建代码,然后传递给 URLLoader.load( )
// 打开新浏览器窗口
var jsCode:String = "javascript:void(
newWin=window.open('http://www.person13.com/'," +
"'newWindow', 'width=" + winW +
", height=" + winH + "," +
"left=" + winX + ",top=" + winY + "'));";
// 使用 URLLoader 对象调用 JavaScript 函数
urlLoader.load(new URLRequest(jsCode));
另外,得到屏幕分辨率可以确定是否缩放Flash 影片。例如,用户把屏幕分辨率调高了,这时字体
就变得小了。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 10 页 共 17 页
3.6. 缩放影片
问题
我想让影片适应屏幕大小
解决办法
使用 stage.scaleMode 属性
讨论
这里有几种缩放模式:exactFit, noBorder, noScale, 和 showAll。为了避免编写上错误,这些字符
串都成为了flash.display.StageScaleMode 类的静态属性:EXACT_FIT, NO_BORDER,
NO_SCALE, 和 SHOW_ALL.
Flash 播放器默认的缩放模式是showAll。这种模式会按照影片原始比例进行缩放以适应播放器大
小。这样如果播放器的比例和影片的比例不一致就会导致电影边框的出现。设置应用程序的缩放模
式:
stage.scaleMode = StageScaleMode.SHOW_ALL;
注意到 stage 并不是个全局对象,但是它是任何可视化对象的一个属性,因此这个语句在sprite 类
或继承自 DisplayObject 类里都可以。
noBorder 模式在保持原始比例下进行缩放以适应播放器,但是,如果播放器和影片比例不匹配,影
片显示不下的会被剪切掉,使用下面的语句设置:
stage.scaleMode = StageScaleMode.NO_BORDER;
exactFit 模式缩放影片适应播放器,它改变了电影原始比例,如果必要,它会匹配播放器,这样电
影总是填充整个播放器,但是这样电影中的元素可能会扭曲,代码如下:
stage.scaleMode = StageScaleMode.EXACT_FIT;
noScale 模式即不进行缩放,保持原始比例。使用该模式不要忘了设置对齐方式(看 3.7 节):
stage.scaleMode = StageScaleMode.NO_SCALE;
scaleMode 属性值并不影响右键菜单里功能,不过你可以禁用菜单里的缩放功能,看3.8 节。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 11 页 共 17 页
3.7. 改变对齐方式
问题
我要改变影片的对齐方式
解决办法
使用 stage.align 属性
讨论
默认下Flash 电影会居中显示。可以利用任何可视化对象的stage.align属性来重新设置电影的对齐
方式。flash.display.StageAlign 类的属性:
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 12 页 共 17 页
3.8. 隐藏Flash播放器的菜单项
问题
我要隐藏右键菜单
解决办法
不能够完全改变Flash 播放器的右键弹出菜单,但是可以设置stage.showDefaultContextMenu 属
性为false来最小化菜单项。
讨论
默认下Flash播放器右键弹出菜单的项目有:
Zoom In
Zoom Out
Show All
Quality (Low, Medium, or High)
Settings
Print
Show Redraw Regions (debug 版本)
Debugger (debug 版本)
About Adobe Flash Player 9
通过下面的语句可以移除许多项目,Settings和About 是不能移除的:
stage.showDefaultContextMenu = false;
遗憾的是,Flash 没有提供方法完全禁用右键菜单。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 13 页 共 17 页
3.9. 检测设备音频
问题
我要确定播放器正在使用的音频设备.
解决办法
使用 flash.system.Capabilities 类的 hasAudio 和 hasMP3 属性
讨论
如果用户系统有播放音频的能力,则 flash.system.Capabilities.hasAudio 属性就返回True 。这实
际上很重要,如果目标设备不支持音频,那就要避免强制用户下载音频内容(因此音频内容都比较
大)。
// 只有当播放器可以播放声音才载入包含声音的.swf
if (flash.system.Capabilities.hasAudio) {
content = "sound.swf";
} else {
content = "silent.swf";
}
即时系统有播放音频能力也不意味着它有播放mp3 的能力。因此当发布含有mp3 内容时应用
flash.system.Capabilities.hasMP3 属性检测下目标设备。
if (flash.system.Capabilities.hasMP3) {
var  url:URLRequest = new URLRequest("sound.mp3");
sound = new Sound(url);
sound.play( );
} else {
// code to load an external .swf containing a ADCP sound
}
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 14 页 共 17 页
3.10. 检测设备视频
问题
我要确定目标设备是否可以播放视频
解决办法
使用 flash.system.Capabilities 类的hasEmbeddedVideo, hasStreamingVideo, 和 hasVideoEncoder 属

讨论
检测用户端是否能播放视频也同样重要,使用flash.system.Capabilities.hasStreamingVideo 属性检测
是否能播放视频流。如果返回 false,就可以让用户下载内嵌视频的.swf 文件,在这之前也要用
flash.system.Capabilities.hasEbeddedVideo 确定,看下面的代码:
if(flash.system.Capabilities.hasStreamingVideo) {
// 播放视频流
}
else if(flash.system.Capabilities.hasEmbeddedVideo) {
// 下载内嵌视频的swf文件
}
else {
}
如果应用程序需要视频流编码,比如传送摄像机视频流,还要确定系统是否具有编码能力,使用
flash.system.Capabilities.hasVideoEncoder 属性检测。
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 15 页 共 17 页
3.11. 提示用户改变播放器设置
问题
我要打开用户的Flash 播放器设置对话框窗口
解决办法
使用 flash.system.Security.showSettings( ) 方法.
讨论
flash.system.Security.showSettings( ) 方法打开播放器设置对话框,它包含多个标签,也可以调用该方
法时传递参数给它直接打开相应标签,该参数字符串是 flash.system.SecurityPanel 类的静态属性:
SecurityPanel.CAMERA
摄像机面板
SecurityPanel.DEFAULT
默认面板
SecurityPanel.LOCAL_STORAGE
本地存储面板
SecurityPanel.MICROPHONE
话筒面板
SecurityPanel.PRIVACY
安全控制面板
SecurityPanel.SETTINGS_MANAGER
设置管理面板会打开浏览器进行更多设置
如果没有传递参数,默认使用 SecurityPanel.DEFAULT. 下面的例子打开本地存储面板:
flash.system.Security.showSettings(SecurityPanel.LOCAL_STORAGE);
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 16 页 共 17 页
3.12. 处理系统安全
问题
我要在应用程序中载入其他域的swf文件,并且允许它访问程序中的 ActionScript
解决办法
使用flash.system.Security.allowDomain( ), flash.system.Security.allowInsecureDomain( ),或 一个政策
文件。
讨论
很多情况下应用程序有多个分布在不同域里的swf 组成。如果你要载入外部域的swf 文件,需要通
过 flash.system.Security.allowDomain( ), flash.system.Security.allowInsecureDomain( ), 或一个政策文
件设定
假设accessing.swf 在mydomain.com,它要访问otherdomain.com 中的accessed.swf 中的一个变量,
而默认accessed.swf是不允许外部域的swf访问它,为了解决这个问题,在accessed.swf中加入以下
语句:
flash.system.Security.allowDomain(" http://mydomain.com");
允许指定的域可以访问它。
也许你会注意到,被载入的swf 如果要访问载入它的swf 是不可以的,同样,载入它的swf 也要加
入上面的语句设置。
域名可以是字符串形式,也可以使IP地址。如果你想让所有域都能访问它,可以设置为 "*"。 However,
但这样做可能会导致安全问题,不推荐。
如果 accessed .swf 文件在基于https://的服务器里,默认它不能被基于http://的域访问,设置
flash.system.Security.allowDomain( )也没用,这时应该使用flash.system.Security.allowInsecureDomain( )
设置非安全的http 域可以访问。
这个办法虽好,但是如果经常变动域名就要重新编译swf 文件就麻烦了,最好的办法是创建一个策
略文件.
ActionScript 3 Cookbook 中文版
第三章. 运行时环境
第 17 页 共 17 页
该策略文件是一个 XML 文件,列出了被允许的域:
<?xml version="1.0"?>
<!--  http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain=" www.otherdomain.com" />
<allow-access-from domain="*.adobe.com" />
<allow-access-from domain="123.45.67.89" />
</cross-domain-policy>
该文件被命名为 crossdomain.xml。通过 flash.system.Security.loadPolicyFile( )读取文件,参数为指定
crossdomain.xml 文件的URL字符串。
指定任何域都可访问:
<allow-access-from domain="*" />
阻止任何域访问:
<cross-domain-policy>
</cross-domain-policy>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值