动态调整Flash / Flex嵌入对象大小时的奇怪行为

时间:2008-10-29 20:36:01

标签: flex actionscript-3

我有一个简单的Flex应用程序,它是一个内置转发器的面板;虽然有点简化,但就像这样:


<mx:Panel id="pnl">
    <mx:Repeater id="rp">
        <mx:Label text = "foo" />
    </mx:Repeater>
</mx:Panel>

然后我将此Flex应用程序嵌入到HTML包装器中。然后,当Flex面板更改大小时,我尝试动态调整HTML中嵌入的Flash对象的大小(从而允许Flex应用程序消耗尽可能多的HTML页面)。

我这样做是通过执行以下actionscipt:


pnl.addEventListener(ResizeEvent.RESIZE,function(event:Event):void {
    ExternalInterface.call("resize",event.target.height);
});

反过来调用此javascript函数:


function resize(height) {
    // the embed or object that contains the flex app
    var e = document.getElementById('flex_object');
    if(e) e.height = height;
}

这似乎在IE中完美无缺,但是我在Firefox / Safari中得到了奇怪的结果,转发器的工作次数为 n ,然后文本似乎被切断/消失了中继器,见附图: alt text http://img528.imageshack.us/img528/9538/rpre0.jpg

任何人都可以解释为什么会发生这种情况,以及是否有任何变通方法/方法可以做同样的事情?

4 个答案:

答案 0 :(得分:1)

我目前正在做同样的事情(一个动态改变它的高度的swf,取决于它当前持有的内容)。尝试制作多行按钮时,我也遇到了类似的问题。

我是flex的新手,但我设法手动调用容器的updateDisplayList()来解决问题...我认为它“强制”渲染某个地方......它的参数是某个区域的宽度和高度变化发生的地方。很抱歉不知道详细信息......但它对我有用。

答案 1 :(得分:0)

为什么不简单地在Flash页面的HTML页面上使用百分比宽度和高度?这样您就不需要做任何事情来调整SWF的大小......

答案 2 :(得分:0)

这很奇怪 - 看起来Firefox / Safari正在扩展嵌入的绘图区域,但不知何故Flash没有得到它需要渲染新像素的消息。

你可以通过做一些事情来强制Flash自行更新来解决这个问题,但是由于浏览器和嵌入之间的通信似乎很混乱,因此采用不同的方法可能不那么惹人注意了'没有窃听的事件流。

例如,您可以尝试将Flash设置为DIV,将Flash的大小设置为100%,然后调整DIV的大小,而不是调整嵌入的大小。这似乎不太可能是行为不端。

答案 3 :(得分:0)

我的经验是,Flex的调整大小能力......很有趣。有时他们的工作方式与人们期望的方式有关,有时他们却没有。您可以尝试以下几种方法:首先,跟踪您希望在Flex中获得的高度值,甚至是ExternalInterface.call(“alert”,event.target.height);这会让你知道它是肯定是JavaScript还是Flex问题(但我怀疑它是Flex)。

您的问题可能与组件的缩放有关:

设置[height]属性会导致调度resize事件。有关何时调度此事件的详细信息,请参阅resize事件。如果组件的scaleY属性不是100,则组件与其内部坐标的高度将不匹配。因此,scaleY为200的100像素高分量将在父母中占用100像素,但在内部会认为它是50像素高。

如果它是Flex并且没有帮助,我会尝试在ExternalInterface调用前使用callLater,这通常会让Flex有足够的时间来弄清楚它在做什么。偶尔,需要setTimeout,但我发现这很尴尬。