在 HTML 中嵌入 SWF 内容

Adobe AIR 1.0 和更高版本

在 AIR 应用程序中,可以像在浏览器中那样,在 HTML 中嵌入 SWF 内容。使用 object 标签、 embed 标签或同时二者可嵌入 SWF 内容。

注: 常见的 Web 开发做法是同时使用 object 标签和 embed 标签在 HTML 页中显示 SWF 内容。此做法在 AIR 中毫无益处。您可以只使用 W3C 标准的 object 标签在 AIR 中显示内容。同时,对于浏览器中显示的 HTML 内容,您可以继续同时使用 object embed 标签(如果需要)。

如果在显示 HTML 和 SWF 内容的 NativeWindow 对象中启用了透明度,则用于嵌入内容的窗口模式 ( wmode ) 设置为 window 时,AIR 不会显示 SWF 内容。要在透明窗口的 HTML 页中显示 SWF 内容,请将 wmode 参数设置为 opaque transparent window wmode 的默认值,因此如果不指定值,则可能不会显示所需内容。

以下示例说明如何使用 HTML object 标签在 HTML 内容中显示 SWF 文件。应将 wmode 参数设置为 opaque 才可显示内容,即使基础 NativeWindow 对象是透明的。SWF 文件加载自应用程序目录,但您可以使用 AIR 支持的任何 URL 方案。(SWF 文件的加载位置决定了 AIR 放置内容的安全沙箱。)

<object type="application/x-shockwave-flash" width="100%" height="100%"> 
    <param name="movie" value="app:/SWFFile.swf"></param> 
    <param name="wmode" value="opaque"></param> 
</object>

还可以使用脚本动态地加载内容。以下示例创建了一个 object 节点,用于显示 urlString 参数中指定的 SWF 文件。该示例将此节点添加为页面元素的子元素,并使用 elementID 参数来指定 ID:

<script> 
function showSWF(urlString, elementID){ 
    var displayContainer = document.getElementById(elementID); 
    var flash = createSWFObject(urlString, 'opaque', 650, 650); 
    displayContainer.appendChild(flash); 
} 
function createSWFObject(urlString, wmodeString, width, height){ 
    var SWFObject = document.createElement("object"); 
    SWFObject.setAttribute("type","application/x-shockwave-flash"); 
    SWFObject.setAttribute("width","100%"); 
    SWFObject.setAttribute("height","100%"); 
    var movieParam = document.createElement("param"); 
    movieParam.setAttribute("name","movie"); 
    movieParam.setAttribute("value",urlString); 
    SWFObject.appendChild(movieParam); 
    var wmodeParam = document.createElement("param"); 
    wmodeParam.setAttribute("name","wmode"); 
    wmodeParam.setAttribute("value",wmodeString); 
    SWFObject.appendChild(wmodeParam);      
    return SWFObject; 
} 
</script>

如果缩放或旋转 HTMLLoader 对象或者将 alpha 属性设置为 1.0 之外的任何值,则不会显示 SWF 内容。在早于 AIR 1.5.2 的版本中,无论将 wmode 值设置为何值,透明窗口中都不显示 SWF 内容。

注: 当嵌入式 SWF 对象尝试加载外部资源(如视频文件)时,如果 HTML 文件中未提供视频文件的绝对路径,可能无法正确呈现 SWF 内容。不过,嵌入式 SWF 对象可以使用相对路径加载外部图像文件。

下面的示例描述了如何通过嵌入到 HTML 内容中的 SWF 对象加载外部资源:

    var imageLoader; 
     
    function showSWF(urlString, elementID){ 
        var displayContainer = document.getElementById(elementID); 
        imageLoader = createSWFObject(urlString,650,650); 
        displayContainer.appendChild(imageLoader); 
    } 
 
    function createSWFObject(urlString, width, height){ 
    
        var SWFObject = document.createElement("object"); 
            SWFObject.setAttribute("type","application/x-shockwave-flash"); 
            SWFObject.setAttribute("width","100%"); 
            SWFObject.setAttribute("height","100%"); 
             
        var movieParam = document.createElement("param"); 
            movieParam.setAttribute("name","movie"); 
            movieParam.setAttribute("value",urlString); 
            SWFObject.appendChild(movieParam); 
             
        var flashVars = document.createElement("param"); 
            flashVars.setAttribute("name","FlashVars");    
    
        //Load the asset inside the SWF content. 
            flashVars.setAttribute("value","imgPath=air.jpg");    
            SWFObject.appendChild(flashVars); 
    
        return SWFObject; 
    } 
    function loadImage() 
    { 
      showSWF("ImageLoader.swf", "imageSpot"); 
      
    }

在下面的 ActionScript 示例中,读取 HTML 文件传递的图像路径,并将该图像加载到舞台上:

package 
{ 
      import flash.display.Sprite; 
      import flash.display.LoaderInfo; 
      import flash.display.StageScaleMode; 
      import flash.display.StageAlign; 
      import flash.display.Loader; 
      import flash.net.URLRequest; 
      
      public class ImageLoader extends Sprite 
      { 
            public function ImageLoader() 
            { 
                  
                  var flashvars = LoaderInfo(this.loaderInfo).parameters; 
                  
                  if(flashvars.imgPath){ 
                        var imageLoader = new Loader(); 
                        var image = new URLRequest(flashvars.imgPath); 
                        imageLoader.load(image); 
                        addChild(imageLoader); 
                        imageLoader.x = 0; 
                        imageLoader.y = 0; 
                        stage.scaleMode=StageScaleMode.NO_SCALE;                    
                        stage.align=StageAlign.TOP_LEFT; 
                  } 
            } 
      } 
}