我有一个简单的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
任何人都可以解释为什么会发生这种情况,以及是否有任何变通方法/方法可以做同样的事情?
答案 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,但我发现这很尴尬。