向 AIR 窗口添加内容的方式取决于窗口类型。例如,使用 MXML 和 HTML,您能够以声明方式定义窗口的基本内容。可以在应用程序 SWF 文件中嵌入资源,也可以从单独的应用程序文件中加载这些资源。Flex、Flash 和 HTML 内容都可以动态创建和动态添加到窗口。
在加载包含 JavaScript 的 SWF 内容或 HTML 内容时,必须考虑 AIR 安全模型。应用程序安全沙箱中的任何内容(即与应用程序一起安装且可用 app: URL 方案加载的内容)具有对所有 AIR API 的完全访问权限。从此沙箱外部加载的任何内容均无法访问 AIR API。应用程序沙箱外部的 JavaScript 内容无法使用 JavaScript Window 对象的
runtime
、
nativeWindow
或
htmlLoader
属性。
为允许安全的跨脚本访问,可以使用沙箱桥在应用程序内容和非应用程序内容之间提供有限的接口。在 HTML 内容中,还可以将应用程序的页面映射到非应用程序沙箱中以允许该页面上的代码跨脚本访问外部内容。请参阅
AIR 安全性
。
加载 SWF 文件或图像
可以使用
flash.display.Loader
类将 Flash SWF 文件或图像加载到本机窗口的显示列表中:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.display.Loader;
public class LoadedSWF extends Sprite
{
public function LoadedSWF(){
var loader:Loader = new Loader();
loader.load(new URLRequest("visual.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadFlash);
}
private function loadFlash(event:Event):void{
addChild(event.target.loader);
}
}
}
注:
如果使用 ActionScript 1 或 2 创建的早期 SWF 文件加载到同一窗口中,则它们共享全局状态,例如定义、单一实例和全局变量。如果此类 SWF 文件依赖于未做改动的全局状态才能正确工作,则无法将其多次加载到同一窗口,也无法使用重叠的类定义和变量将其作为另一个 SWF 文件加载到同一窗口。此内容可以加载到单独的窗口中。
将 HTML 内容加载到 NativeWindow 中
若要将 HTML 内容加载到 NativeWindow 中,可以将 HTMLLoader 对象添加到窗口舞台并将 HTML 内容加载到 HTMLLoader 中,也可以使用
HTMLLoader.createRootWindow()
方法创建已包含 HTMLLoader 对象的窗口。以下示例在本机窗口舞台上的 300 x 500 像素的显示区域内显示 HTML 内容:
//newWindow is a NativeWindow instance
var htmlView:HTMLLoader = new HTMLLoader();
htmlView.width = 300;
htmlView.height = 500;
//set the stage so display objects are added to the top-left and not scaled
newWindow.stage.align = "TL";
newWindow.stage.scaleMode = "noScale";
newWindow.stage.addChild( htmlView );
//urlString is the URL of the HTML page to load
htmlView.load( new URLRequest(urlString) );
若要将 HTML 页加载到 Flex 应用程序中,可以使用 Flex HTML 组件。
如果窗口使用透明度(即窗口的
transparent
属性为
true
),则不会显示 HTML 文件中的 SWF 内容,除非将用于引用 SWF 文件的 object 或 embed 标签的
wmode
参数设置为
opaque
或
transparent
。
wmode
的默认值为
window
,因此默认情况下,透明窗口中不显示 SWF 内容。无论使用哪种
wmode
值,透明窗口中都不显示 PDF 内容。
另外,如果缩放、旋转 HTMLLoader 控件或将 HTMLLoader
alpha
属性设置为 1.0 之外的任何值,则不会显示 SWF 内容和 PDF 内容。
将 SWF 内容添加为 HTML 窗口上的覆盖图
由于 HTML 窗口包含在 NativeWindow 实例中,因此可以将 Flash 显示对象添加到显示列表中 HTML 层的上方或下方。
若要将显示对象添加到 HTML 层的上方,请使用
window.nativeWindow.stage
属性的
addChild()
方法。
addChild()
方法将分层的内容添加到窗口中任何现有内容的上方。
若要将显示对象添加到 HTML 层的下方,请使用
window.nativeWindow.stage
属性的
addChildAt()
方法,为
index
参数传入值零。将对象放在零索引处会将现有内容(包括 HTML 显示)上移一层并在底部插入新内容。为使在 HTML 页下方分层的内容可见,必须将
HTMLlLoader
对象的
paintsDefaultBackground
属性设置为
false
。此外,该页中设置背景颜色的任何元素都将不是透明的。例如,如果设置页面 body 元素的背景颜色,则该页的所有内容都将不是透明的。
以下示例说明如何将 Flash 显示对象作为覆盖图或衬垫层添加到 HTML 页。该示例创建两个简单的 shape 对象,在 HTML 内容下方和上方各添加一个 shape 对象。该示例还基于
enterFrame
事件更新形状位置。
<html>
<head>
<title>Bouncers</title>
<script src="AIRAliases.js" type="text/javascript"></script>
<script language="JavaScript" type="text/javascript">
air.Shape = window.runtime.flash.display.Shape;
function Bouncer(radius, color){
this.radius = radius;
this.color = color;
//velocity
this.vX = -1.3;
this.vY = -1;
//Create a Shape object and draw a circle with its graphics property
this.shape = new air.Shape();
this.shape.graphics.lineStyle(1,0);
this.shape.graphics.beginFill(this.color,.9);
this.shape.graphics.drawCircle(0,0,this.radius);
this.shape.graphics.endFill();
//Set the starting position
this.shape.x = 100;
this.shape.y = 100;
//Moves the sprite by adding (vX,vY) to the current position
this.update = function(){
this.shape.x += this.vX;
this.shape.y += this.vY;
//Keep the sprite within the window
if( this.shape.x - this.radius < 0){
this.vX = -this.vX;
}
if( this.shape.y - this.radius < 0){
this.vY = -this.vY;
}
if( this.shape.x + this.radius > window.nativeWindow.stage.stageWidth){
this.vX = -this.vX;
}
if( this.shape.y + this.radius > window.nativeWindow.stage.stageHeight){
this.vY = -this.vY;
}
};
}
function init(){
//turn off the default HTML background
window.htmlLoader.paintsDefaultBackground = false;
var bottom = new Bouncer(60,0xff2233);
var top = new Bouncer(30,0x2441ff);
//listen for the enterFrame event
window.htmlLoader.addEventListener("enterFrame",function(evt){
bottom.update();
top.update();
});
//add the bouncing shapes to the window stage
window.nativeWindow.stage.addChildAt(bottom.shape,0);
window.nativeWindow.stage.addChild(top.shape);
}
</script>
<body onload="init();">
<h1>de Finibus Bonorum et Malorum</h1>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis
et quasi architecto beatae vitae dicta sunt explicabo.</p>
<p style="background-color:#FFFF00; color:#660000;">This paragraph has a background color.</p>
<p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis
praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias
excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui
officia deserunt mollitia animi, id est laborum et dolorum fuga.</p>
</body>
</html>
此示例简要介绍了 AIR 中跨越 JavaScript 和 ActionScript 之间边界的一些高级技术。如果您不熟悉如何使用 ActionScript 显示对象,请参阅
《Adobe ActionScript 3.0 开发人员指南》
中的
显示编程
。