不能不说的秘密 Flsah Player全屏模式的BUG[原]
9 十一 2007
在 Flsah Player 9 有了2套运行AS脚本的虚拟机,早期版本(SWF版本为8.0或更早,AS脚本版本为1.0或2.0),这类SWF文件由AVM1来运行,
最新的SWF版本为9.0,AS脚本为3.0,这类SWF文件由效率更高的AVM2来执行。
由于两套AVM完全不同,如果新版SWF文件载入早期版本的SWF,那么早期的SWF他运行在AVM1,而且_lockroot为true,变量,事件都不能访问和监听。总之就是看得到,摸不着。所以开发的时候就要避免加载早期的SWF,来避免不可控制。
然而郁闷的是所有被载入的SWF都是9.0 AS3的版本,在全屏模式的切换下居然爆出被加载进来的是AVM1Movie(AVM1影片在AS3环境下的类型),然后在被载入SWF一切的对象访问、事件触发、gotoAndPlay 统统失效。而且在被载入的SWF自身的AS代码控制统统失效。表现为始终在循环播放。
遇到这样的问题,开发的产品不得不放弃全屏模式。等待Adobe修复这个BUG吧。
据进一步测试,这个问题出现在stage 有 resize 时会出现这个BUG。但尚未找到绕过补救的办法。
如果你是Flash、Flex开发者。在开发有全屏需求的项目时,务必确认这个BUG已经修复。
我在Flex 3 beta2 和Flash 9 en中编译出的SWF均出现这个BUG。
OS:Windows XP SP2 CHS
Flash Player Version:WIN 9,0,47,0 ActiveX
vmVersion:1.0 d597
下面的是一个BUG演示。
由一个主SWF循环加载2个子SWF,三个SWF均为AS3版本。
被加载的SWF是一个简单动画,当播放到最后一帧时由代码控制其停止并发起END事件。
主SWF监听子SWF发起的END事件,触发另一个一个加载。
主SWF的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
package { import flash.display.AVM1Movie; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageDisplayState; import flash.display.StageScaleMode; import flash.events.*; import flash.net.URLRequest; import flash.text.TextField; import flash.text.TextFormat; import flash.system.System import flash.system.Capabilities; public class LoaderDebug extends Sprite { var loader_1:Loader = new Loader(); var loader_2:Loader = new Loader(); var loader_1_info:TextField = new TextField(); var loader_2_info:TextField = new TextField(); var player_info:TextField = new TextField(); var load_urls=new Array('swf.9.3_1.swf','swf.9.3_2.swf'); var load_index=0; var last_loader:Loader=loader_1; var last_loader_info:TextField=loader_1_info; public function LoaderDebug() { stage.scaleMode=StageScaleMode.NO_SCALE; stage.align=StageAlign.TOP_LEFT; this.addChild(loader_1); this.addChild(loader_2); this.addChild(loader_1_info); this.addChild(loader_2_info); this.addChild(player_info); loader_1_info.width=loader_2_info.width=200; loader_1_info.y=loader_2_info.y=200; loader_2_info.x=loader_2.x=200; player_info.y=300; player_info.width=300; stage.addEventListener(MouseEvent.CLICK,this_CLICK); loader_1.contentLoaderInfo.addEventListener(Event.COMPLETE,loader_COMPLETE); loader_2.contentLoaderInfo.addEventListener(Event.COMPLETE,loader_COMPLETE); player_info.text='Flash Player Version:'+Capabilities.version+'\n' player_info.text+='vmVersion:'+System.vmVersion+'\n' player_info.text+='serverString:'+Capabilities.serverString loadClip(); } function nextIndex(){ load_index++; if(load_index>=load_urls.length)load_index=0; } function loader_END(event){ last_loader.unload(); last_loader_info.text=''; loadClip(); } function loader_COMPLETE(event){ var content=event.target.content; var content_loaderInfo:LoaderInfo=event.target; content.addEventListener('END',loader_END) if(content is AVM1Movie){ var format:TextFormat= new TextFormat(); format.color=0xFF0000; format.bold=true; last_loader_info.defaultTextFormat=format; } last_loader_info.text='content:'+content_loaderInfo.content+'\n'; last_loader_info.text+='actionScriptVersion:'+content_loaderInfo.actionScriptVersion+'\n' last_loader_info.text+='swfVersion:'+content_loaderInfo.swfVersion+'\n'; } function loadClip(){ if(last_loader==loader_2){ loader_1.load(new URLRequest(load_urls[load_index])); last_loader=loader_1; last_loader_info=loader_1_info; }else if(last_loader==loader_1){ loader_2.load(new URLRequest(load_urls[load_index])); last_loader=loader_2; last_loader_info=loader_2_info; } nextIndex(); } function this_CLICK(event){ if(stage.displayState ==StageDisplayState.NORMAL){ stage.displayState =StageDisplayState.FULL_SCREEN; }else{ stage.displayState =StageDisplayState.NORMAL; } } } } |
被加载的SWF是个时间轴动画,最后一帧的代码:
1 2 |
stop(); dispatchEvent(new Event("END")); |
演示地址:http://cbmland.com/demo/LoaderDebug/LoaderDebug.html
源文件分析:http://cbmland.com/demo/LoaderDebug/LoaderDebug.rar
这个BUG在独立的FlashPlayer没有发现,在XP SP2 CHS 下的 IE 6.0 和 FirFox1.009 均存在,Oprea和其他操作系统下请网友帮忙确认。
补充:
确认这个BUG可以看方块下面的文字。
content:[object AVM1Movie]
actionScriptVersion:3
swfVersion:9
如果文字变红,且content为[object AVM1Movie]时,就是BUG来了。这个时候载入的SWF都不能自己停止在最后一帧了,里面的AS脚本已经在失控状态。
很搞的是AS和SWF版本是3.0和9.0,这个和AVM1Movie是矛盾的,AS3.0怎么在AVM1Movie里运行?
- 28 Comments , 57,310 Hits
- Filed under: 不能不说的秘密
-
Tags: Flash, Flash Player, Flex
28 Responses for "不能不说的秘密 Flsah Player全屏模式的BUG[原]"
-
还有9.0.115之前的版本在flash的html容器中加入wmode=”transparent” 或 opaque 无法全屏.
-
flash的全屏,仅仅是为了做视频应用的,全屏模式下做应用本来就是个错误,全屏模式下无法接收任何键盘事件(除了esc)。
-
我现在正在开发一个大型项目,也遇到了这个问题,郁闷中
-
我也碰到了这个问题,当时以为是我哪写错了
但是按钮还是起作用的,代码有的起作用有的不起作用一直循环
今天看这个我终于明白不是我的问题了 -
es correcto
Leave a Reply
2008-01-15 10:01