功能示例:检测系统功能Flash Player 9 和更高版本 CapabilitiesExplorer 示例演示了如何使用 flash.system.Capabilities 类确定用户的 Flash 运行时版本支持的功能。该示例讲授以下方法:
若要获取此范例的应用程序文件,请参阅 www.adobe.com/go/learn_programmingAS3samples_flash_cn。可以在 Samples/CapabilitiesExplorer 文件夹中找到 CapabilitiesExplorer 应用程序文件。该应用程序包含下列文件:
CapabilitiesExplorer 概述CapabilitiesExplorer.mxml 文件负责设置 CapabilitiesExplorer 应用程序的用户界面。用户的 Flash 运行时版本的功能将在舞台上的 DataGrid 组件实例内显示。如果用户是从 HTML 容器运行应用程序且外部 API 可用,也将显示其浏览器功能。 调度主应用程序文件的 creationComplete 事件时,将调用 initApp() 方法。initApp() 方法从 com.example.programmingas3.capabilities.CapabilitiesGrabber 类中调用 getCapabilities() 方法。initApp() 方法的代码如下所示: private function initApp():void
{
var dp:Array = CapabilitiesGrabber.getCapabilities();
capabilitiesGrid.dataProvider = dp;
}
CapabilitiesGrabber.getCapabilities() 方法返回 Flash 运行时和浏览器功能的排序的数组,然后将其设置为舞台上的 capabilitiesGrid DataGrid 组件实例的 dataProvider 属性。 CapabilitiesGrabber 类概述CapabilitiesGrabber 类的静态 getCapabilities() 方法将 flash.system.Capabilities 类中的每个属性添加到数组 (capDP)。然后调用 CapabilitiesGrabber 类中的静态 getBrowserObjects() 方法。getBrowserObjects() 方法使用外部 API 循环访问浏览器的导航器对象(包含浏览器的功能)。getCapabilities() 方法如下所示: public static function getCapabilities():Array
{
var capDP:Array = new Array();
capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable});
capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility});
capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio});
...
capDP.push({name:"Capabilities.version", value:Capabilities.version});
var navArr:Array = CapabilitiesGrabber.getBrowserObjects();
if (navArr.length > 0)
{
capDP = capDP.concat(navArr);
}
capDP.sortOn("name", Array.CASEINSENSITIVE);
return capDP;
}
getBrowserObjects() 方法返回一个数组,该数组包含浏览器的导航器对象中的每个属性。如果该数组的长度为一个或多个项目,则将浏览器功能的数组 (navArr) 追加到 Flash Player 功能的数组 (capDP) 末尾,并按字母顺序对整个数组进行排序。最后,排序后的数组将返回到主应用程序文件,随后填充数据网格。getBrowserObjects() 方法的代码如下所示: private static function getBrowserObjects():Array
{
var itemArr:Array = new Array();
var itemVars:URLVariables;
if (ExternalInterface.available)
{
try
{
var tempStr:String = ExternalInterface.call("JS_getBrowserObjects");
itemVars = new URLVariables(tempStr);
for (var i:String in itemVars)
{
itemArr.push({name:i, value:itemVars[i]});
}
}
catch (error:SecurityError)
{
// ignore
}
}
return itemArr;
}
如果当前用户环境中有外部 API,Flash 运行时将调用 JavaScript JS_getBrowserObjects() 方法,该方法循环访问浏览器的导航器对象并向 ActionScript 返回 URL 编码的值的字符串。该字符串随后将转换为 URLVariables 对象 (itemVars) 并添加到 itemArr 数组中,将向调用脚本返回该数组。 与 JavaScript 进行通信作为构建 CapabilitiesExplorer 应用程序的最后一部分工作,要编写循环访问浏览器导航器对象中的每个项目所必需的 JavaScript,并将一个名称/值对追加到一个临时数组的末尾。container.html 文件中的 JavaScript JS_getBrowserObjects() 方法的代码如下所示: <script language="JavaScript">
function JS_getBrowserObjects()
{
// Create an array to hold each of the browser's items.
var tempArr = new Array();
// Loop over each item in the browser's navigator object.
for (var name in navigator)
{
var value = navigator[name];
// If the current value is a string or Boolean object, add it to the
// array, otherwise ignore the item.
switch (typeof(value))
{
case "string":
case "boolean":
// Create a temporary string which will be added to the array.
// Make sure that we URL-encode the values using JavaScript's
// escape() function.
var tempStr = "navigator." + name + "=" + escape(value);
// Push the URL-encoded name/value pair onto the array.
tempArr.push(tempStr);
break;
}
}
// Loop over each item in the browser's screen object.
for (var name in screen)
{
var value = screen[name];
// If the current value is a number, add it to the array, otherwise
// ignore the item.
switch (typeof(value))
{
case "number":
var tempStr = "screen." + name + "=" + escape(value);
tempArr.push(tempStr);
break;
}
}
// Return the array as a URL-encoded string of name-value pairs.
return tempArr.join("&");
}
</script>
代码首先创建一个临时数组,该数组用于保存导航器对象中的所有名称/值对。接下来,使用 for..in 循环对导航器对象进行循环访问,并计算出当前值的数据类型以过滤掉不需要的值。在此应用程序中,我们只需要 String 或 Boolean 值,其他数据类型(例如函数或数组)将被忽略。导航器对象中的每个 String 或 Boolean 值将追加到 tempArr 数组末尾。然后,使用 for..in 循环对浏览器的屏幕对象进行循环访问,并将每个数值添加到 tempArr 数组中。最后,使用 Array.join() 方法将临时数组转换为字符串。该数组使用 (&) 符号作为分隔符,这使得 ActionScript 可以使用 URLVariables 类轻松分析数据。 |
|