功能示例:检测系统功能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 类轻松分析数据。 |
|