天天看點

Flash與Flex3的配合,特總結一下心得體會

今天折騰了大半天Flash與Flex3的配合,特總結一下心得體會:

1) 如果是通過Embed來嵌入swf的話,Flex3隻支援FlashCS2所建立的swf.

2) 如果是通過loader來加載的話,隻有AS3的swf才能在加載後被控制(這和第一點相反,我花了很長時間才弄明發現這兩點,汗!)

3) 如果要直接加載到Flex當中,類必須繼承UIComponent,這好比在Flash中必須繼承DisplayObject

4) 如果要把Flash的組建打包給Flex使用,應該使用FlexComponentKit,把MC導出成swc。然後在Flex中把swc配置到Library Path後,對應的組建就可以作為一等公明在Flex中使用了。如果MC是綁定了類的,那麼對應類繼承UIComponent就可以了。

在googleDocs下了一個corelib包,不是蠻實用的(前段時間還自己寫trim,浪費時間啊),E文看得累,以備以後檢視

//圖相用法

import com.adobe.images.JPGEncoder;

public function submit():void {

var encoder:JPGEncoder = new JPGEncoder(80);

var bytes:ByteArray = encoder.encode(getBitmapData());

var request:URLRequest = new URLRequest(UPLOAD_PAGE);

//data值就為圖檔編碼資料ByteArray;

request.data = bytes;

request.method = URLRequestMethod.POST;

//這個是關鍵,内容類型必須是下面檔案流形式;

request.contentType = “application/octet-stream”;

var loader:URLLoader = new URLLoader();

loader.load(request);

}

//加密用法

import com.adobe.crypto.SHA1;

trace(SHA1.hash(”132″));

//utils包比較繁鎖,全都是靜态方法

import com.adobe.utils.ArrayUtil;

ArrayUtil.arrayContainsValue(arr, value);//arr是否包含value

ArrayUtil.arraysAreEqual(arr1, arr2);//arr1,arr2是否相等

ArrayUtil.copyArray(a);//深拷貝

ArrayUtil.removeValueFromArray(arr, value);//删除值value

import com.adobe.utils.StringUtil;

StringUtil.beginsWith(str1, str2);//str1是否以str2開頭

StringUtil.endsWith(str1, str2);//str1是否以str2結束

StringUtil.ltrim(str);//去左空格

StringUtil.rtrim();

StringUtil.trim();

StringUtil.remove(str1, str2);//從str1删除str2

StringUtil.replace(input, replace, replaceWith);//把input中的replace置換為replaceWith

StringUtil.stringsAreEqual(s1, s2, caseSensitive);//s1,s2是否相等,caseSensitive是否大小寫敏感

import com.adobe.utils.DateUtil;

DateUtil.compareDates(d1, d2);//比較,d1>d2傳回-1,=傳回0,<傳回1

DateUtil.getAMPM(d);//傳回AM or PM

….功能比較全, 太多了, 還有幾個不知道

import com.adobe.utils.NumberFormatter;

NumberFormatter.addLeadingZero(5);//傳回補0的數,如1變成01

import com.adobe.utils.IntUtil;

IntUtil.toHex(n,bigEndian);//16進制,bigEndian指定是後補0,還是前補0

IntUtil.rol(n, m);//n右移m位(位運算)

IntUtil.ror(n, m);//左移

import com.adobe.utils.DictionaryUtil;

DictionaryUtil.getKeys(d);//得到鍵名

DictionaryUtil.getValues(d);//得到值

import com.adobe.utils.XMLUtil;

這個還不會用,以後慢慢摸,本來AS3的XML就很完善了

corelib包下載下傳位址

Flash跨域調用問題

由于安全沙箱的限制, 處于不同域下的檔案(swf, xml等)在預設狀态下是不能互相調用的. 比如A域名下的flash不能通路B域名下的XML. 除非B域名在根目錄下的”crossdomain.xml”文檔中包含A域名. 但存在以下問題:

1) 不允許改動根目錄

解決方法: 在AS3允許crossdomain.xml不在根目錄中,這時就要用Security.loadPolicyFile(”http://www.example.com/sub/dir/pf.xml”);這樣的方法來指定. 當然隻有crossdomain.xml所在目錄是可以通路的.

2) 不允許添加crossdomain.xml

解決方法: 如果要被讀取的是swf檔案, 隻要在主函數中加入flash.system.Security.allDomain(”A”)即可. 但如果是其他各式的檔案, 比如xml文檔的話怎麼辦呢? 可以把xml讀取到B上的b.swf(b上加入flash.system.Security.allDomain(”A”)). 然後在A的a.swf中加載b.swf,然後讀取b.swf中的xml. 類似于:

_mc =event.target.content as Sprite;

trace(_mc["var"]);

Loader與URLLoader的比較

AS3已經中Loader與URLLoader是兩個比較容易混淆的類,特此區分:

應用範圍

Loader: swf,圖檔(jpg,png,gif)

URLLoader:文本檔案(xml,php,jsp…)

使用方法

Loader:

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

private function loadComplete(event:Event)

{ trace("done");addChild(loader);}

URLLoader:

xmlLoader.dataFormat=URLLoaderDataFormat.TEXT;

xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);

private function xmlLoaded(event:Event)

{

try {myXML = XML(event.target.data);area.text=myXML;}

catch (e:TypeError) {area.text="Load faild:/n"+e.message;}

}

AS3-點陣化文字

上面是這兩天做的一個小東西,它能夠把輸入的文字用點陣來描述,并存這些資訊存入一個數組當中。然後用這個數組來重新生成“文字”,這些“文字”可以由任意的Sprite組成,并且可以随意加上動畫。

承蒙大家厚愛,把源檔案放在這裡供大家下載下傳。為了便于将來擴充,我使用的是Observer設計模式,希望不會把大家搞混淆。

源檔案下載下傳

Javascript與Flash互動

在SwfObject解決Html與Flash之間傳遞參數問題中已經簡要介紹了如何使用SwfObject在頁面中插入Flash,如何在初始時由JS向Flash傳遞參數,以及運作時Flash如何調用JavaScript中函數。這裡主要介紹運作時JavaScript如何互相傳遞參數, 并控制Flash的播放。

源檔案下載下傳

其實JS能直接控制Flash的播放,主要通過下列方法實作:

Play() —————————————- 播放動畫

StopPlay()————————————停止動畫

IsPlaying()———————————– 動畫是否正在播放

GotoFrame(frame_number)—————- 跳轉到某幀

TotalFrames()——————————- 擷取動畫總幀數

CurrentFrame()——————————回傳目前動畫所在幀數-1

Rewind()————————————-使動畫傳回第一幀

SetZoomRect(left,top,right,buttom)——-放大指定區域

Zoom(percent)——————————改變動畫大小

Pan(x_position,y_position,unit)————使動畫在x,y方向上平移

PercentLoaded()—————————-傳回動畫被載入的百分比

LoadMovie(level_number,path)———– 加載動畫

TGotoFrame(movie_clip,frame_number)- movie_clip跳轉到指定幀數

TGotoLabel(movie_clip,label_name)—— movie_clip跳轉到指定标簽

TCurrentFrame(movie_clip)————— 回傳movie_clip目前幀-1

TCurrentLabel(movie_clip)—————–回傳movie_clip目前标簽

TPlay(movie_clip)—————————播放movie_clip

TStopPlay(movie_clip)———————-停止movie_clip的播放

GetVariable(variable_name)—————–擷取變量

SetVariable(variable_name,value)———–變量指派

TCallFrame(movie_clip,frame_number)—call指定幀上的action

TCallLabel(movie_clip,label)—————-call指定标簽上的action

TGetProperty(movie_clip,property)——–擷取movie_clip的指定屬性

TSetProperty(movie_clip,property,number)-設定movie_clip的指定屬性

Read the rest of this entry »

Flash中元件(Component)的建立和使用

這裡簡要介紹Flash中自定義組建的建立和使用方法.由于工作的原因,我用的是AS2, AS3的應該類似。

組建的建立

1 建立一個類檔案,比如ClassLoader。這個檔案實作元件的主要功能。它可以調用其它類,比如cn.adamstudio.effects.TextAnimation(這個類自己寫,可以是簡單的一個trace),這些類将會自動打包到元件中。

//ClassLoader類:

[IconFile("spidercore.png")];

class ClassLoader extends MovieClip

{

public function setSize()

{

_width=18;

_height=18;

}

public function doNothing():Void

{

// Trick the compiler into including

// the TextAnimation class in the component.

cn.adamstudio.effects.TextAnimation;

}

}

2 建立一個Fla檔案,如SWC_Generator。在其中建立一個MovieClip,如swc, 設定如下圖:

3 在庫中這個MC上右鍵,在右鍵菜單裡選擇”Component Definition…”.設定如下圖:

4 此時在庫面闆中可以看出,MC已經轉換成了一個元件.因為元件處在編輯狀态.是以直接導入一個png圖示到舞台上,如icon.png.這個圖示是建立組建的圖形标志,将來在庫面闆和舞台上将會看到它的身影.

5 在庫中這個MC上右鍵,在右鍵菜單裡選擇”Export SWC File …”,儲存SWC檔案.

組建的使用

1 将生成的SWC檔案拷入:

C:/Documents and Settings/User /Local Settings/ Application Data /Adobe /Flash CS3 /en /Configuration/Components/swc

2 建立一個Flash檔案,如test.fla.在Flash中重新打開Component面闆後,會發現swc目錄下有我們拷入的SWC檔案.将其拖入舞台後,在舞台上删除之.(隻需要它在庫中).

3 在第一幀上加入代碼:

import cn.adamstudio.effects.TextAnimation;

var textAni=new TextAnimation;

即使本地電腦中沒有cn.adamstudio.effects.TextAnimation,程式照樣能運作,因為它這個類已經包含在了SWC檔案當中.

注:SWC_Generator.fla和test.fla的輸出設定都應該選擇AS2,否則無法得到正确結果;

源檔案下載下傳:源檔案

AS2 - 建立MovieClip的子類

在Flash中作視覺表現時,常常需要建立MovieClip的子類。下面是一個不錯的架構:

Avatar子類:

class cn.adamstudio.Avatar extends MovieClip

{

//定義靜态變量,用于初始化

public static var HAPPY:Number = 0;

public static var SAD:Number = 1;

public static var IDLE:Number = 2;

//定義靜态方法,用于簡潔地建立自己的instance

public static function createAvatar(name:String, target:MovieClip, depth:Number, x:Number, y:Number):Avatar

{

var av:Avatar = Avatar(target.attachMovie(”AvatarSymbol”, name, depth));

av.init(x,y);

return av;

}

//設定instance的坐标

public function init(x:Number, y:Number):Void

{

setState(Avatar.HAPPY);

this._x = x;

this._y = y;

}

//初始化instance

public function setState(newState:Number):Void

{

switch (newState) {

case Avatar.HAPPY :

this.gotoAndStop(”HAPPY”);

break;

case Avatar.SAD :

this.gotoAndStop(”SAD”);

break;

case Avatar.IDLE :

this.gotoAndStop(”IDLE”);

break;

}

}

}

注:其中的靜态變量和靜态函數是可選的,可以根據需求的不同而有所變化。

主文檔中:

import cn.adamstudio.Avatar;

var av:Avatar=Avatar.createAvatar("avatar",_root,0,200,200);

這種方法的特點和優點是用使用子類的靜态方法來執行個體化MovieClip的子類,在主文檔中非常簡潔。

源檔案下載下傳

AS-可正可負随機數的算法

我以前的寫法都是:

Math.random()*2-1

今天看到一個比較有意思的寫法:

Math.random()-Math.random()

AS3滑鼠坐标總結

滑鼠是Flash裡追主要的互動因素,經常需要偵測滑鼠事件(AS3中滑鼠事件小結)和得到滑鼠的坐标。滑鼠坐标的擷取可以分為在文檔類和在子類中,兩種不同的情況。

1)如果是在時間線軸上,或者文檔類上使用:

stage.mouseX 和 stage.mouseY

2)在子類(如_sprite:Sprite)上使用:

_sprite.mouseX 和 _sprite.mouseY

這裡得到的是滑鼠相對于_sprite的坐标。如果需要的是相對于舞台的坐标,則應該使用localToGlobal,如:

var mousePoint:Point=new Point(_sprite.mouseX, _sprite.mouseY);

mousePoint=_sprite.localToGlobal(mousePoint);

trace("Stage coordinates:"+mousePoint);

注:要使用以上代碼别忘了 import flash.geom.Point;

AS3練習-往返運動

這是今天做的一個AS3的運動練習,主要是加速和減速運動的配合。發現粒子多了就會出現一些奇怪的現象,比如偶爾會幾個粒子在原位置閃動。可能更Flash的代碼執行順序有關,暫時還搞不懂。

as3運作時錯誤中文說明

1000 系統記憶體不足。 系統可用記憶體無法滿足 Flash Player 編譯代碼的需要。請關閉系統上正在運作的某些應用程式或程序。

1001 未實作方法 _。

1002 Number.toPrecision 的範圍是 1 至 21。Number.toFixed 和 Number.toExponential 的範圍是 0 至 20。指定的值不在期望範圍之内。 指定的值不在 precision 參數的期望範圍之内。Number.toPrecision 的範圍是 1 至 21。Number.toFixed 和 Number.toExponential 的範圍是 0 至 20。

1003 radix 參數必須介于 2 至 36 之間;得到 _。 為方法或屬性的 radix 參數傳遞的值小于 2 或大于 36。請傳遞一個介于 2 至 36 之間的值作為 radix 參數。

1004 對不相容的對象調用方法 _。 嘗試調用的方法不适用于指定對象。如果已将原型函數從一個對象複制到另一個對象然後又調用此函數,但目标對象類型與原始對象類型不同,則會發生此錯 誤。請確定目标對象與原始對象的類型相同。有關詳細資訊,請參閱 ECMAScript Language Specification(《ECMAScript 語言規範》)第 3 版中的第 15 章。

1005 數組索引不是正整數 (_)。 嘗試使用非正整數的索引值通路數組成員。僅傳遞正整數作為數組的索引值。

1006 _ 不是函數。 嘗試調用不存在的函數時,發生此錯誤。請確定正在調用正确的函數且自 ActionScript 2.0 以來此 API 尚未發生更改。此外,請確定正在使用正确的對象。例如,使用以下代碼時,将出現此錯誤(由于最後一行錯誤調用了變量 big 而未調用變量 blg):

var blg:String = “foo”;

var big:Sprite = new Sprite();

var error:int = big.length();

1007 嘗試對非構造函數進行執行個體化。

1008 _ 指代不明确;發現多個比對的綁定。

1009 無法通路空對象引用的屬性或方法。 計算結果為 null 的對象可以不包含任何屬性。在某些意外(盡管有效)的情況下,可能發生此錯誤。以建立 Sprite 對象的以下代碼為例。由于從未将此 Sprite 對象添加到顯示清單中(使用 DisplayObjectContainer 對象的 addChild() 方法),是以其 stage 屬性設定為 null。在這種情況下,此示例将生成此錯誤,這是因為 Sprite 對象的 stage 屬性不能擁有任何屬性: Read the rest of this entry »

AIR-最新RSSReader(基于Flash)

經過長時間的努力,終于用Flash CS3+AS3+AIR Beta2做出了RSSReader 2.0。

前一段時間用html+JS做了個WordpressReader, 雖然實作了自動更新,等很cool的功能,但界面還是比較簡樸。

AIR讀取Blog RSS - Adobe AIR Beta2 實踐

WordpressReader 1.1 完成

這次做的RSSReader是基于ActionScript3的,界面漂亮了很多,而且使用者體驗也有了顯著的提高。

程式下載下傳:http://www.adamstudio.cn/blog/download/RSSReader.air

初始介面:

文章閱讀界面:

實作的功能:

1 讀取伺服器端XML文檔;

2 将讀取的XML文檔儲存到AIR的内建本地資料庫SQLite !!!(太酷了!)

3 判斷網絡連接配接狀況,如果網絡暢通就讀取并以動畫的形式展示文章标題,同時用最新文章重新整理SQLite中已有文章。如果網絡不通,則讀取并顯示SQLite中儲存的文章;

4 以動畫形式展示動畫文章标題;

5 自定義事件和文章标題與文章内容之間的切換。

多說也無用,試用一下你就知道Adobe AIR有多強了!

程式下載下傳:http://www.adamstudio.cn/blog/download/RSSReader.air

Flash-navigateToURL取代getURL

AS3中使用navigateToURL取代了getURL,個人感覺navigateToURL最大的好處就是友善了傳遞參數,不足的地方嘛,據說彈出的新視窗會被浏覽器攔截。需要使用:ExternalInterface.call(”window.open”,winurl,”");來避免,但是這是采用了調用JS來做,是必須在浏覽器支撐并且JS可以使用的情況下(沒有測試)。

另外發現在Adobe AIR中使用navigateToURL打開連接配接時,隻能在新視窗中打開(不會被浏覽器攔截),”_self”,”_parent”,”_top”都沒有用.而且都是調用浏覽器,而不是在AIR中打開.

具體用法如下:

package {

import flash.display.Sprite;

import flash.net.navigateToURL;

import flash.net.URLRequest;

import flash.net.URLVariables;

public class NavigateToURLExample extends Sprite {

public function NavigateToURLExample() {

var url:String = “http://www.adobe.com”;

var variables:URLVariables = new URLVariables();

variables.exampleSessionId = new Date().getTime();

variables.exampleUserLabel = “Your Name”;

var request:URLRequest = new URLRequest(url);

request.data = variables;

try {

navigateToURL(request);

}

catch (e:Error) {

// handle error here

}

}

}

}

Flash-如何改變動态文本透明度?

因為Flash的系統字型不直接支援透明,是以我們得通過嵌入字型或者Filter類來解決。簡單地通過改變動态文本的alpha或者它做在的mc的alpha都是沒有用的。

1 嵌入字型

這種方法最簡單,選中動态文本框,然後在屬性面闆中點嵌入(“Embed”)按鈕,按後選擇要全部字庫嵌入,還是隻嵌入部分字元。但代價是檔案會變大,尤其在嵌入中文字型的時候,絕對是噩夢。當然隻是嵌入下載下傳進度0-9這樣簡單的幾個字元,還是非常友善的。

2 Filter

這是從Blueidea學來的,就是給動态文本增加一個濾鏡,即使是空濾鏡也可以。

AS3中代碼

//建立動态文本

var my_txt:TextField=new TextField();

my_txt.autoSize = TextFieldAutoSize.LEFT;

my_txt.background = true;

my_txt.border = true;

my_txt.text = “Hello world and welcome to the show.”;

//定義濾鏡

var txt_blur:BlurFilter = new BlurFilter(0, 0, 0);

my_txt.filters = [txt_blur];

my_txt.alpha = 0.5;

//加入動态文本

my_txt.x=my_txt.y=50;

addChild(my_txt);

AS2中代碼

import flash.filters.BlurFilter;

var txt_blur:BlurFilter = new BlurFilter(0, 0, 0);

this.createTextField(”my_txt”, 1, 100, 100, 300, 100);

my_txt.text = “DDGGDGDGDGDG”;

my_txt.filters = [txt_blur];

my_txt._alpha = 50;

3 BitmapData 和 ColorMatrixFilter

據HbrO說BitmapData和ColorMatrixFilter也能實作動态文本的半透明效果。但我這人比較懶,發現一種方法之後就犯懶了。以後有時間再研究吧 ,哈哈。

AS3中滑鼠事件小結

滑鼠事件(MouseEvent)和滑鼠位置(AS3滑鼠坐标總結)是RIA中最重要的人機互動途徑。最近在做一個動态産品展示的系統ProdutShow的時候才發現自己對滑鼠事件的了解有多麼膚淺。現在ProductShow已經做完了,這裡把在使用滑鼠事件時要注意的問題總結一下:

1 滑鼠事件分為MOUSE_OVER, MOUSE_MOVE, MOUSE_DOWN, MOUSE_UP, MOUSE_OUT, MOUSE_WHEEL和MOUSE_LEAVE。其中前六個事件都來自flash.events.MouseEvent類,最後一個MOUSE_LEAVE卻是來自flash.events.Event,在導入類包的時候一定要注意這個問題,因為我在這點上就花了很長時間調試,才得發現問題所在。

MOUSE_OVER - 滑鼠移動到目标對象之上時觸發, 可以用于模拟按鈕的mouse over效果;

MOUSE_MOVE - 滑鼠在目标對象之上移動時觸發,主要用于判斷。比如判斷在拖拽執行個體時,執行個體是否在允許的範圍之内,如果超出,立刻停止拖拽或者重新設定執行個體的坐标;

MOUSE_DOWN - 滑鼠在目标對象之上按下時觸發。注意,隻有按下滑鼠左鍵時才會觸發,右鍵和滾輪都不會觸發。在目标對象之外按下滑鼠左鍵,再移動到目标對象之上時,也不會觸發;

MOUSE_UP - 滑鼠在目标對象之上松開時觸發。注意,隻有松開滑鼠左鍵時才會觸發,右鍵和滾輪都不會觸發。在目标對象之上按下滑鼠左鍵,再移動到目标對象之外松開時,不會觸發。但在目标對象之外按下滑鼠左鍵,再移動到目标對象之上松開時,就會觸發。

MOUSE_OUT- 滑鼠移動到目标對象之外時觸發。

MOUSE_WHEEL - 滑鼠在目标對象之上轉動滾輪時觸發。

MOUSE_LEAVE - 當光标離開舞台時觸發(stage.addEventListener(Event.MOUSE_LEAVE,leaveHandler);)。在使用自定滑鼠後,在滑鼠離開舞台時,觸發MOUSE_LEAVE事件,然後可以把自定義的滑鼠隐藏掉,避免還停留在舞台上。

2 mouseChildren。目标對象中含有子執行個體時,感應滑鼠行為的是子時列,而非目标對象。如果使用 cursor.mouseEnabled=false; 就可以由目标對象來更應滑鼠行為。

3 mouseEnabled。當執行個體重疊時,出于顯示清單上方的執行個體總比下方執行個體更有優先權感應滑鼠行為。當想讓下方執行個體感應滑鼠行為時使用 cursor.mouseEnabled=false; 即可。這常用于自定義滑鼠後,去除自定義滑鼠對滑鼠行為的幹涉,因為自定義滑鼠往往一直處于滑鼠下方,其他執行個體無法再感應到滑鼠的變化。

另外,也許DOUBLE_CLICK也應該算做滑鼠事件,但要使用它,必須先讓doubleClickEnabled=true:

var bg:Sprite=new Sprite();

bg.doubleClickEnabled=true;

bg.addEventListener(MouseEvent.DOUBLE_CLICK,clickHandler);

typeof、is、as的差別

typeof、is、as都是用于判斷變量類型的,隻是各自的傳回值不同。請看下方代碼:

var a:Number=0;

trace(typeof(a));//輸出:Number

trace(typeof(typeof(a)));//輸出:String

trace(a is Number);//輸出:true

trace(a as Number);//輸出:0

trace(a as String);//輸出:null

Null、NaN和undefined的差別

其實Null、NaN和undefined都是變量的預設初始值。變量類型不同,系統給與的初始值就不同:

int,uint - 0

Boolean - false

Number - NaN

String,Array,Object - null

未指定變量類型 - undefined

SwfObject解決Html與Flash之間傳遞參數問題

在徹底摒棄Adobe的激活ActiveX控件的方法一文中已經詳細分析了使用Adobe提供的AC_RunActiveContent.js導緻HTML與Flash之間不能傳遞參數的問題。經過Adobe論壇裡GWD的提示,我轉而尋求SwfObject的幫助。發現SwfObject是一個很好的解決方案。

SwfObject英文介紹:http://blog.deconcept.com/swfobject/

SwfObject中文翻譯:http://www.awflasher.com/flash/articles/swfobj.htm

源檔案:SWFObject 1.5

關于SwfObject的介紹上面兩篇文章已經講的很詳細了。我這裡隻列一段标準的應用和一些上面兩篇文章沒有提到的問題.

Html中的JS代碼

<script type="text/javascript" src="swfobject.js"></script>

<script type="text/javascript">

// <![CDATA[

var so = new SWFObject("asCallJs.swf", "MyDemo", "500", "400", "9", "#FF6600");

so.addVariable("param1", "Parameter1"); // this line is optional, but this example uses the variable and displays this text inside the flash movie

so.addVariable("param2", "Parameter2");

so.useExpressInstall('expressinstall.swf');

so.write("flashcontent");

// ]]>

</script><!--被AS調用的JS函數-->

<script language="Javascript">

// <![CDATA[

// adds two numbers, and sends the result back to ActionScript

function addNumbers(num1, num2)

{

result=num1 + num2;

alert("3+7=" + result);

return (result);

}

// ]]>

</script> Read the rest of this entry »

徹底摒棄Adobe的激活ActiveX控件的方法

大家知道,在IE中隻有激活了ActiveX控件,Flash才能夠與浏覽者互動,否則得手動點一下激活。Flash也提供了一個很“友善”的解決方案,就是在釋出swf檔案的同時,釋出html檔案即可。這樣Flash會在生成一個swf檔案,一個包含swf的Html檔案,和一個“AC_RunActiveContent.js”檔案。Html檔案通過調用AC_RunActiveContent.js,實作激活ActiveX控件。這一切都很便捷,直到你希望在html和Flash之間傳遞參數。

問題出現

在很多商業網站中,都涉及到用同一個Flash來顯示大量不同的内容(圖檔,視訊或産品資訊等),這就需要向這個Flash傳遞參數。常見的傳參方法有三種,但都會受到AC_RunActiveContent.js的不良影響。

1 ExternalInterface: 這是困擾我最久的一個問題。據Adobe的描述,這是最好的傳參方法,能都非常自由和直接地在AS和JS之間互相傳遞參數或者互相調用函數。但我在使用Adobe的示例檔案時發現,在IE中AS無法得到JS的傳回值(ExternalInterface在IE中的Bug),經過不斷的嘗試才發現是AC_RunActiveContent.js在搗鬼,隻要把它和html中對應代碼以及<noscript></noscript>删除就一切正常了。

請看示例:

Player8,AS2: http://www.adamstudio.cn/lab/var/test/test_v8.html

Player9,AS3: http://www.adamstudio.cn/lab/var/test/test_v9.html

如果帶有激活ActiveX控件的那段JS代碼,IE中就無法得到傳回值,請看:

http://www.adamstudio.cn/lab/var/test/test_error.html

所有源檔案:http://www.adamstudio.cn/lab/var/test/test.rar

2 FlashVars:

3 URL傳遞參數

後兩種方法受AC_RunActiveContent.js的影響更大,因為這兩種方法都是在<noscript></noscript>之間加入代碼,而在JS能運作的浏覽器當中(絕大多數浏覽器都能運作JS),這些代碼根本就不會運作。是以無論在Firefox或者IE中都不起任何作用!

也就是說常用的三種在Html與AS之間傳遞參數的方法均受到激活ActiveX控件的那段代碼的影響。是以要想在html和Flash之間傳遞參數,就必須摒棄Flash自帶的激活ActiveX控件的方案!

替代方案:SwfObject 請參考SwfObject解決Html與Flash之間傳遞參數問題

繼續閱讀