Ошибка рендеринга Flash и Chrome - PullRequest
1 голос
/ 18 ноября 2011

У меня странная проблема, когда Flash Player в Chrome не обновляется, если размер браузера не изменен. Приложение представляет собой онлайн-инструмент дизайна, написанный на Flex, и одна из функций позволяет пользователю загружать изображение и обрезать его. Изображение загружается нормально, и действие кадрирования не перезагружает изображение, а использует Bitmap.copyPixels для создания обрезанной версии.

Когда я тестирую на localhost (хотя локальный сервер не только прямо из файловой системы), проблема не возникает. Однако на нашем QA-сервере изображение не появится, если вы не измените размер браузера, когда я полагаю, что принудительное обновление экрана.

Я попробовал все обычные подозреваемые в AS3 / Flex, чтобы вызвать перерисовку, updateAfterEvent, invalidateDisplayList и т. Д.

Одно из хакерских решений, которое мы придумали, - изменить размер браузера на пиксель, но это, очевидно, не идеально, и я бы предпочел решение в обход:)

спасибо!

Вот битовый код для справки ...

var cropData:BitmapData = new BitmapData( _crop.width, _crop.height );
var originalData:BitmapData = new BitmapData( _loader.width, _loader.height );
originalData.draw( _loader );
cropData.copyPixels( originalData, _crop, new Point() );

var crop:Bitmap = new Bitmap( cropData );
crop.smoothing = true;
this.addChild( crop );

if ( _width > 0 && _height > 0 ) 
{
    crop.width = _width;
    crop.height = _height;
}

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Попробуйте добавить событие enterFrame к «this» и переместить растровое изображение обрезки, чтобы увидеть, что происходит.Судя по всему, это ошибка Flash / Chrome.Работает ли он в других браузерах?

РЕДАКТИРОВАТЬ:

Попробуйте добавить это и посмотреть, что произойдет:

var crop:Bitmap = new Bitmap( cropData );
crop.smoothing = true;
this["cropTest"] = crop; // Add this
this.addEventListener(Event.ENTER_FRAME, onEnterFrameTest); // Add this
this.addChild( crop );

// Add this function
protected function onEnterFrameTest(evt : Event) : void {
    this["cropTest"].x += this["cropTest"].x > 0 ? -1 : 1;
}

Если выдает ошибкупросто переключите этот ["cropTest"] с объявленной переменной на это.

РЕДАКТИРОВАТЬ2:

Замените весь показанный код следующим:

this["loaderTest"] = _loader;
this.addEventListener(Event.ENTER_FRAME, onEnterFrameTest); // Add this

// Add this function
protected function onEnterFrameTest(evt : Event) : void {
    this.removeEventListener(onEnterFrameTest);

    var _loader = this["loaderTest"];
    var cropData:BitmapData = new BitmapData( _crop.width, _crop.height );
    var originalData:BitmapData = new BitmapData( _loader.width, _loader.height );
    originalData.draw( _loader );
    cropData.copyPixels( originalData, _crop, new Point() );

    var crop:Bitmap = new Bitmap( cropData );
    crop.smoothing = true;
    this.addChild( crop );

    if ( _width > 0 && _height > 0 ) 
    {
        crop.width = _width;
        crop.height = _height;
    }
}
2 голосов
/ 18 ноября 2011

Мой первый импульс заключается в том, что компиляторы двух ваших сред различны. Однажды я обнаружил, что результаты, скомпилированные Flash Builder и mxmlc под Linux, не совпадают.

1 голос
/ 19 ноября 2011

Flash-проигрыватель был встроен с параметром wmode, установленным в «непрозрачный», с этим параметром, похоже, иногда возникает ошибка во flash-плеере для Chrome, из-за которой закрытие компонента Flex mx: Panel не приводит к обновлению экрана .

Удаление параметра wmode устраняет вышеуказанную проблему, но ошибка остается.

...