不能不說的祕密 Flsah Player全屏模式的BUG[轉]

在 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. package {
  2.     import flash.display.AVM1Movie;
  3.     import flash.display.Loader;
  4.     import flash.display.LoaderInfo;
  5.     import flash.display.Sprite;
  6.     import flash.display.StageAlign;
  7.     import flash.display.StageDisplayState;
  8.     import flash.display.StageScaleMode;
  9.     import flash.events.*;
  10.     import flash.net.URLRequest;
  11.     import flash.text.TextField;
  12.     import flash.text.TextFormat;
  13.     import flash.system.System
  14.     import flash.system.Capabilities;
  15.     public class LoaderDebug extends Sprite
  16.     {
  17.             var loader_1:Loader = new Loader();
  18.             var loader_2:Loader = new Loader();
  19.             var loader_1_info:TextField = new TextField();
  20.             var loader_2_info:TextField = new TextField();
  21.             var player_info:TextField = new TextField();
  22.             var load_urls=new Array('swf.9.3_1.swf','swf.9.3_2.swf');
  23.             var load_index=0;
  24.             var last_loader:Loader=loader_1;
  25.             var last_loader_info:TextField=loader_1_info;
  26.  
  27.         public function LoaderDebug()
  28.         {
  29.             stage.scaleMode=StageScaleMode.NO_SCALE;
  30.             stage.align=StageAlign.TOP_LEFT;
  31.             this.addChild(loader_1);
  32.             this.addChild(loader_2);
  33.             this.addChild(loader_1_info);
  34.             this.addChild(loader_2_info);
  35.             this.addChild(player_info);
  36.  
  37.             loader_1_info.width=loader_2_info.width=200;
  38.             loader_1_info.y=loader_2_info.y=200;
  39.             loader_2_info.x=loader_2.x=200;
  40.             player_info.y=300;
  41.             player_info.width=300;
  42.             stage.addEventListener(MouseEvent.CLICK,this_CLICK);
  43.             loader_1.contentLoaderInfo.addEventListener(Event.COMPLETE,loader_COMPLETE);
  44.             loader_2.contentLoaderInfo.addEventListener(Event.COMPLETE,loader_COMPLETE);
  45.  
  46.  
  47.             player_info.text='Flash Player Version:'+Capabilities.version+'/n'
  48.             player_info.text+='vmVersion:'+System.vmVersion+'/n'
  49.             player_info.text+='serverString:'+Capabilities.serverString
  50.  
  51.  
  52.             loadClip();
  53.  
  54.         }
  55.         function nextIndex(){
  56.             load_index++;
  57.             if(load_index>=load_urls.length)load_index=0;
  58.  
  59.         }
  60.         function loader_END(event){  
  61.  
  62.             last_loader.unload();
  63.             last_loader_info.text='';
  64.             loadClip();
  65.         }
  66.         function loader_COMPLETE(event){
  67.  
  68.             var content=event.target.content;
  69.             var content_loaderInfo:LoaderInfo=event.target;
  70.             content.addEventListener('END',loader_END)
  71.  
  72.             if(content is AVM1Movie){
  73.             var format:TextFormat= new TextFormat();
  74.             format.color=0xFF0000;
  75.             format.bold=true;
  76.             last_loader_info.defaultTextFormat=format;
  77.             }
  78.  
  79.  
  80.             last_loader_info.text='content:'+content_loaderInfo.content+'/n';
  81.             last_loader_info.text+='actionScriptVersion:'+content_loaderInfo.actionScriptVersion+'/n'
  82.             last_loader_info.text+='swfVersion:'+content_loaderInfo.swfVersion+'/n';
  83.  
  84.  
  85.         }
  86.         function loadClip(){
  87.  
  88.             if(last_loader==loader_2){
  89.                 loader_1.load(new URLRequest(load_urls[load_index]));
  90.                 last_loader=loader_1;
  91.                 last_loader_info=loader_1_info;
  92.  
  93.             }else if(last_loader==loader_1){
  94.  
  95.                 loader_2.load(new URLRequest(load_urls[load_index]));
  96.                 last_loader=loader_2;
  97.                 last_loader_info=loader_2_info;
  98.             }
  99.             nextIndex();
  100.  
  101.         }
  102.         function this_CLICK(event){
  103.  
  104.             if(stage.displayState ==StageDisplayState.NORMAL){
  105.                 stage.displayState =StageDisplayState.FULL_SCREEN;
  106.             }else{
  107.                 stage.displayState =StageDisplayState.NORMAL;
  108.             }
  109.         }
  110.     }
  111. }
被加載的SWF是個時間軸動畫,最後一幀的代碼:

  1. stop(); 
  2. dispatchEvent(new Event("END"));

演示地址:http://www.cbmland.com/demo/LoaderDebug/LoaderDebug.html
源文件分析:http://www.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裏運行?



下面的代碼經試驗證明是可以的!

  1. EventListener = new Object;
  2. EventListener.onFullScreen = function( bFull:Boolean ){
  3.   if(bFull){
  4.     vtxt.text  = "You are in Full Screen Mode";
  5.   }
  6.   else{
  7.      vtxt.text  = "You are in Normal Screen Mode";
  8.   }
  9. }
  10. Stage.addListener( EventListener );

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章