Странное поведение при динамическом изменении размера Flash / Flex встраиваемого объекта - PullRequest
0 голосов
/ 29 октября 2008

У меня есть простое приложение Flex, представляющее собой панель с повторителем внутри; хотя и немного упрощенно, это примерно так:


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

Затем я встраиваю это приложение Flex в оболочку HTML. Затем я пытаюсь динамически изменить размер встроенного Flash-объекта в HTML по мере изменения размера панели Flex (что позволяет приложению Flex потреблять столько HTML-страниц, сколько ему необходимо).

Я делаю это, выполняя следующие действия:


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 количество раз, а затем текст кажется обрезанным / исчезающим в репитере см. прикрепленное изображение: альтернативный текст http://img528.imageshack.us/img528/9538/rpre0.jpg

Может ли кто-нибудь объяснить, почему это происходит, и если есть какие-то обходные пути / способы сделать то же самое?

Ответы [ 4 ]

1 голос
/ 30 августа 2009

В настоящее время я работаю над тем же (swf, который динамически изменяет свою высоту в зависимости от содержимого, которое он в данный момент держит). У меня также была проблема, аналогичная вашей, когда вы пытались сделать многострочную кнопку.

Я новичок в flex, но мне удалось решить проблему вручную, вызвав updateDisplayList () контейнера ... Я думаю, что это "вызывает" рендер где-то ... его параметры - ширина и высота некоторой области где происходят изменения. Извините, что не знал деталей ... Но у меня это сработало.

0 голосов
/ 05 ноября 2008

Это очень странно - похоже, что Firefox / Safari расширяют область рисования встраивания, но почему-то Flash не получает сообщение, необходимое для рендеринга новых пикселей.

Возможно, вы могли бы обойти это, сделав что-то, чтобы заставить Flash обновляться самостоятельно, но поскольку связь между браузерами и встраиванием кажется запутанной, вероятно, было бы менее хакерским использовать другой подход, который подходит для браузеров. поток событий без ошибок.

Например, вместо изменения размера встраивания вы можете попробовать поместить Flash в DIV, установить размер Flash на 100%, а затем изменить размер DIV. Кажется, это намного менее вероятно ведет себя неправильно.

0 голосов
/ 20 января 2009

По моему опыту, способности Flex к изменению размера ... забавны. Иногда они работают так, как можно было ожидать, а иногда нет. Есть несколько вещей, которые вы можете попробовать: во-первых, отследить значение, которое вы ожидаете получить во Flex для высоты или даже ExternalInterface.call ("alert", event.target.height); Это позволит вам точно знать, является ли это проблемой JavaScript или Flex (но я подозреваю, что это Flex).

Возможно, ваша проблема связана с масштабированием компонента:

Установка свойства [height] приводит к отправке события изменения размера. Посмотрите событие изменения размера для деталей о том, когда это событие отправлено. Если свойство scaleY компонента не равно 100, высота компонента из его внутренних координат не будет совпадать. Таким образом, для компонента высотой 100 пикселей со шкалой Y, равной 200, родительский элемент займет 100 пикселей, но внутренне он будет считать, что он имеет высоту 50 пикселей.

Если это Flex, и это не помогает, я бы попытался использовать callLater перед вызовом ExternalInterface, часто это даст Flex достаточно времени, чтобы выяснить, какого черта он делает. Иногда требуется setTimeout, но я нахожу это неловким.

0 голосов
/ 03 ноября 2008

Почему бы просто не использовать процентную ширину и высоту на странице HTML для вашего объекта Flash? Таким образом, вашему событию не нужно ничего делать, чтобы изменить размер SWF ...

...