Flash和Chrome渲染错误

时间:2011-11-18 02:39:25

标签: flash flex google-chrome bitmap render

我有一个奇怪的问题,即除非调整浏览器大小,否则Chrome中的Flash Player不会更新。该应用程序是一个在线设计工具,用Flex编写,其中一个功能允许用户上传图像并裁剪它。图像加载正常,裁剪操作不会重新加载图像,但使用Bitmap.copyPixels创建裁剪版本。

当我在localhost上测试时(虽然本地服务器不仅直接来自文件系统),问题也不会发生。但是,在我们的QA服务器上,除非您调整浏览器大小,否则不会出现图像,因为我认为强制屏幕刷新。

我已经尝试了AS3 / Flex中所有常见的嫌疑人强制重绘,updateAfterEvent,invalidateDisplayList等。

我们提出的一个hacky解决方案是用一个像素调整浏览器的大小,但这显然不是理想的,我更喜欢解决方案来解决这个问题:)

谢谢!

这是用于参考的位图代码......

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 个答案:

答案 0 :(得分:2)

我的第一个冲动是两个环境的编译器不同。我曾经发现Flash Builder和Linux下的mxmlc编译的结果不一样。

答案 1 :(得分:2)

尝试将enterFrame事件添加到“this”并移动裁剪位图以查看会发生什么。从它的外观来看,它是flash / chrome的一个bug。它适用于其他浏览器吗?

修改

尝试添加此内容并查看会发生什么:

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]]切换为声明的变量即可。

<强> EDIT2:

使用以下内容替换所有显示的代码:

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 :(得分:1)

flash播放器嵌入了wmode param设置为'opaque',这个设置似乎偶尔出现在Chrome的Flash播放器中的错​​误,其中关闭Flex mx:Panel组件不会导致屏幕更新

删除wmode参数修复了上述问题,但错误仍然存​​在。