从Flash CS3与Flex应用程序进行交互

我在Flash中有一个全景浏览器,其中我想嵌入一个小的Flex应用程序。我已经成功了Flex SWF加载到Flash这样的:现在从Flash CS3与Flex应用程序进行交互

private var loader:Loader = new Loader(); 

var req:URLRequest = new URLRequest("SimpleImageViewer.swf");

loader.load(req);

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgViewerLoaded);

imgViewerLoaded(event:Event)

{

imageViewer = loader.content;

addChild(imageViewer);

imageViewer.showImage("test.jpg", "Test Image");

}

,事情是,我需要能够调用的方法在图像浏览器,这是我在我的Flex应用程序已经定义像这样:

​​

它也被添加到使用

ExternalInterface.addCallback("showImage", showImage); 

我怎么能说从我的AS3的Flash该方法ExternalInterface的?只需调用它作为imageViewer.showImage(...)给出了这样的错误:

ReferenceError: Error #1069: Property showImage not found on _SimpleImageViewer_mx_managers_SystemManager and there is no default value.

at UserInterface/imgViewerLoaded()

这是整个SimpleImageViewer.mxml文件:

<?xml version="1.0" encoding="utf-8"?> 

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="100" minHeight="100" backgroundColor="#2B2B2B" creationComplete="onCreationComplete(event)" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#2B2B2B, #2B2B2B]" verticalScrollPolicy="off" horizontalScrollPolicy="off">

<mx:Image x="0" y="0" width="100%" height="100%" horizontalAlign="center" verticalAlign="middle" scaleContent="true" maintainAspectRatio="true" id="picture"/>

<mx:Image width="100%" height="42" x="0" y="0" id="headingBg" source="@Embed(source='/bilder/topList.png')" scaleContent="true" maintainAspectRatio="false"/>

<mx:Label x="4" y="0" width="100%" height="43" id="headingTxt" fontFamily="Arial" fontSize="32" color="#FFFFFF" textAlign="center"/>

<mx:Script>

<![CDATA[

import mx.events.FlexEvent;

import mx.events.ResizeEvent;

public function showImage(source:String, heading:String = ""):void

{

picture.source = source;

picture.load();

headingTxt.text = heading;

}

protected function onCreationComplete(event:FlexEvent):void

{

ExternalInterface.addCallback("showImage", showImage);

Security.allowDomain("localhost");

}

]]>

</mx:Script>

</mx:Application>

而且图像浏览器界面:

package tikab.lizzan 

{

public interface ImageViewer

{

function showImage(source:String, heading:String = ""):void ;

}

}

回答:

编辑:

从Flex文档:

If an application is loaded into another application, a SystemManager will still be created, but will not manage an application window, depending on security and domain rules. Instead, it will be the content of the Loader that loaded it and simply serve as the parent of the sub-application

换句话说:当你加载你的Flex应用程序到另一个应用程序,的内容属性loader对象不会直接指向应用程序本身,而是指向作为实际Application对象的父级的SystemManager实例。您的方法调用因此必须针对loader.content.getChildAt(0)

要在类型安全的方式做到这一点:

  1. 创建一个接口
  2. 有你的Flex文档类实现它
  3. 投你的Loader对象的内容的第一个孩子是同一个接口

或(不是类型安全的,但快速)简单地用括号的语法调用方法:

​​

或将loader.content.getChildAt(0)转换为动态类型,如Object或MovieClip,如@_asMan建议。

编辑:

您也在代码中缺少一些重要的声明语句。这是imageViewerLoaded功能应该是什么样子:

function imgViewerLoaded(event:Event) 

{

var imgViewer:MovieClip = loader.content.getChildAt(0) as MovieClip;

addChild(loader.content);

imgViewer.showImage("test.jpg", "Test Image");

}

functionvar应该永远被认为是可选的 - 他们帮助你防止搞乱你的类层次和类型的引用。 (当然,如果你有imgViewer作为成员变量声明,你可以省略var)我也从“imageViewer”更改了名称,以确保没有歧义参考 - 您在下面发布的错误声明意味着存在风险;)

回答:

编辑#2:

试试这个:

function imgViewerLoaded(event:Event):void 

{

var manager:SystemManager = event.target.content as SystemManager;

var content:ImageViewer = manager.application as ImageViewer;

addChild(viewer);

viewer.showImage();

}

这建立在weltraumpirat对内容类型实际上是SystemManager对象的有用见解的基础上。基于我所看到的一切,我认为这会起作用并变得更清洁。祝你好运!

**当然,请注意,你将不得不修改发布MXML实现你的接口,我怀疑你已经做了

编辑#1:基于


您上述消息时,我发现我的一些代码,做了这样的事情:

private function loadCompleted(event:Event):void { 

currentClip = event.target.content as MovieClip;

loader.unload();

displayClip();

}

所以,你可能想也尝试寻找的内容:

event.target.content 

尝试下面的代码,看看是什么类型,然后使用该信息铸造:

var contents:* = event.target.content; 

var className:String = flash.utils.getQualifiedClassName(contents);

trace("Class name was: " + className);

从那里,你也许可以用代码沿线干净访问方法多一点以下内容:

function imgViewerLoaded(event:Event):void 

{

var viewer:TypeThatYouFound = loader.content as TypeThatYouFound;

addChild(viewer);

viewer.showImage();

}

当然,事件内容可能与加载程序内容完全相同。在这种情况下,这种方法不会更好。但是,这值得一试。

希望帮助在某种程度上,

〜gMale


确定。所以我甚至不会问你为什么要这样做(通常情况下,你从flash到flex而不是其他方式)。通常将swfs导入到Flex而不是Flex到SWF中。

首先想到的是,您可能没有为Flex代码创建类。为了公开你的函数,你必须让别人知道你的对象与典型的SimpleImageViewer不同。

取决于你如何设计的东西,你可能需要做一个自定义类像

public class MySimpleImageViewer extends SimpleImageViewer { 

public function showImage(source:String, heading:String = ""):void {

//Show the image

}

}

然后让你的MXML文件的语法如下实例化这个:

<local:MySimpleImageViewer /> 

你的方法是有点非正统,很难说,正是你需要的。如果这没有帮助,尝试发布Flex代码,我们可以从那里......

希望帮助,

〜gMale

回答:

不知道这会工作,但,你有没有试过把它作为一个对象?

imgViewerLoaded(event:Event) 

{

imageViewer = loader.content;

addChild(imageViewer);

Object(loader.content).showImage();

}

或者如果你有一个指定的基础类,也许可以使用套管。我使用的应用作为例子

var loadedApp:Application = Application(loader.content); 

loadedApp.showImage();

以上是 从Flash CS3与Flex应用程序进行交互 的全部内容, 来源链接: utcz.com/qa/266279.html

回到顶部