as腳本之loadMovie完全實現(xiàn)教程
更新時間:2007年03月20日 00:00:00 作者:
使用loadMovie可以動態(tài)的載入外部文件,從而減少主文件的體積,有利于網(wǎng)上下載,以及對各項子文件的修改,更換。如果沒有做過FLASH網(wǎng)頁,可以看看這個FLASH網(wǎng)頁的基本組成情況,見圖2-2-1

只需要把圖中的主文件和子文件用比如ftp工具傳到自己的空間上,就可以輕松的實現(xiàn)只下載主文件,如果需要瀏覽的子文件就可以單獨下載,可以想想,如果你的整個FLASH網(wǎng)頁不分主次,全部統(tǒng)一個FLASH,做成了幾M甚至10多M,那么有誰愿意等著看你的網(wǎng)頁呢?除非你自己。
于是使用loadMovie就顯得很重要了?,F(xiàn)在就讓我們從基礎開頭,然后去分析使用loadMovie所涉及到的具體問題吧。使用loadMovie有兩種基本的方法:(一)將外部swf文件載入到某一層上。(二)將外部swf文件載入到時間軸的某個影片剪輯中。對這兩種方法的使用,用圖表示更加直觀些。見圖2-2-2

第二種方法又可以這樣寫:_root.mc.loadMovie(“a1.swf”);如果a1的后綴名為 jpg那么載入的是外部圖片。載入圖片與載入swf文件的道理是一樣的,就不贅述。說到這里還比較空洞,做一個實例來看看。
一、新建一個文件夾,任意取一個名字 比如:mywangye
二、做一個Flash發(fā)布成swf文件并且取名字為a1,保存在mywangye這個目錄中,這個a1就是我們要載入的子文件。
三、然后做主文件,由于我們是做最簡單的,所以什么也不畫,就在這個主文件的第一楨,寫 loadMovie(“a1.swf”,1) 同樣將這個文件保存在mywangye目錄中,取個名字叫index
四、測試效果,源文件見本文后的打包中的01文件夾
然后用上面圖中的第2種語法,繼續(xù)做一個,注意了,第二種方法需要在舞臺上放一個mc并且取一個實例名,或者創(chuàng)建一個空的MC。做了上面的小實驗后,我們可以總結(jié)些什么結(jié)論呢?如果僅僅是得到可以加載外部文件這么一條結(jié)論的話,那么就太膚淺了。可以讓我們想到:被加入進來的外部文件的坐標問題;長寬問題;外部文件比較大,造成的加載延時問題;如何訪問被加載進來的swf的問題;不要加載了,卸載問題…..這些問題我們?nèi)绻谎芯肯?,真正在做網(wǎng)頁的時候,會遇到很多麻煩的。
由上面的最簡單的加載我們可以得到這樣的結(jié)論:(1)如果采用加載到層上的,加載進來后默認注冊點是舞臺的左上角;如果采用加載到mc里面的,那么默認注冊點是MC的注冊點。如果MC的注冊點是左上角,那么被加載進來的SWF文件就與MC的左上角對準;如果MC的注冊點是中心,那么加載進來的SWF就把左上角與MC的中心對齊。(2)被加載進來的MC保留原來的長寬比例。
問題一:如何控制被加載進來的SWF文件的坐標和長寬比例大?。?br>
控制被加載進來的SWF文件控制其長寬要采用onEnterFrame,比如:
on (press) {
loadMovie("a2.swf", "_root.mymc");
onEnterFrame = function () {
_root.mymc._x = 0;
_root.mymc._y = 0;
_root.mymc._width = 330;
_root.mymc._height = 240;
};
}
為什么用 onEnterFrame呢?因為被加載進來的的過程中,有點延時,如果沒有onEnterFrame語句,那么語句讀取一次就不讀取了,然而讀取了這一次之后,還沒有加載進來,所以就會導致坐標大小設置無效。同樣,如果加載到層上,也是這樣的。
on (press) {
loadMovie("a1.swf", 1);
onEnterFrame = function () {
_level1._x = 17;
_level1._y = 30;
_level1._width = 330;
_level1._height = 240;
};
}
請注意這兩種方法,第一種,把外部的a2加載到mymc中,加在進來后,a2就自動的替換了mymc,我們直接設置mymc的屬性就設置了被加載進來的swf的屬性。第二種方法,_level是對于加載到時間軸上的電影的引用,加載到第2層就是_level2;加載到第3層就是_level3。
問題之二:如何實現(xiàn)點擊按鈕加載一個外部SWF文件,并且要顯示加載的下載進度呢?
有兩個方法來實現(xiàn)這個效果,其一:把加載londing寫在主文件中,其二,被加載的子SWF文件有自己的londing?,F(xiàn)在分別給予說明。
其一:在主文件中寫londing
外部子swf文件名為a1,主文件中有一個動態(tài)文本框名為loadText,一個按鈕名為bbt,現(xiàn)在把loadMovie和londing寫在楨上。
_root.bbt.onPress = function() {
_root.createEmptyMovieClip("mc", 10);
mc.loadMovie("a1.swf");
mc._visible = false;
_root.bbt.onEnterFrame = function() {
var l = mc.getBytesLoaded();
var t = mc.getBytesTotal();
var getPercent = l/t;
loadText = Math.round(getPercent*100)+"%";
if (l>0 && l>=t) {
mc._visible = true;
delete this.onEnterFrame;
}
mc._x = 10;
mc._y = 10;
mc._width =440;
mc._height = 320;
};
};
其二:子文件中有自己的londing
這個寫法與前面說的londing一樣,只是注意一個問題就是注意路徑的問題,比如這樣寫:
第一禎
loaded = getBytesLoaded();
total = getBytesTotal();
lts = Math.round((loaded/total)*100);
wenben = lts+"%";
第二禎
if (lts == 100) {
gotoAndStop(3);
} else {
gotoAndPlay(1);
}
和前面的londing中介紹的比較,看出不同之處沒有呢?僅僅是去掉了_root因為被加載后,外部SWF文件就相當于主文件中的一個MC 有了_root 就是指向主文件的_root 了,當然會顯示錯誤。
問題三:我想在舞臺上畫一個屏幕,然后點擊一個按鈕就載入一個外部swf進行播放該怎樣做呢?
那么我們就來一起做一個相冊吧。當主文件載入后,單擊按鈕就載入一個外部swf 文件,并且都有l(wèi)onding顯示。首先我們做好以下準備工作:(1)準備幾張圖片,現(xiàn)在我們準備7張,6個子文件一個一張,主文件用一張。(2)主文件舞臺大小為了適應網(wǎng)頁的需要,設置為770*420。子文件舞臺大小設置為512*384,這樣就不需要載入后控制大小了,方便些(其實我們應當這樣,省去一些麻煩。
一、制作子文件。每個都用來顯示圖片,第一和第二禎寫londing,第三禎~~二十禎根據(jù)自己的愛好做點亮度變化,以產(chǎn)生動感,最后一禎寫上stop()。第一和第二禎的londing如下
第一禎
loaded = getBytesLoaded();
total = getBytesTotal();
lts = Math.round((loaded/total)*100);
wenben = "數(shù)據(jù)下載中 "+lts+"%";
第二禎
if (lts == 100) {
gotoAndPlay(3);
} else {
gotoAndPlay(1);
}
就這樣如法炮制的制作6個,分別命名為b1…..b6都發(fā)布成swf文件。保存在一個文件夾中。
二、制作主文件
第一禎用來寫londing,第2禎放一些像屏幕一樣的東西,和按鈕,為了增加效果,放一個音樂在時間軸上。
第一禎的londing//由于前面已經(jīng)說得多了,就不贅述了
stop();
i = 0; ,
onEnterFrame = function () {
// 使用不斷觸發(fā)的事件
loaded = _root.getBytesLoaded();
total = _root.getBytesTotal();
var aa = Math.round((loaded/total)*100);
_root.dongtai.wenbens = aa+"%";
_root.dongtai._x = 188+aa*3;
_root.bb._width = aa*3;
if (aa>=100) {
// 檢測到滿足條件就跳出來,否則繼續(xù)循環(huán)
_root.gotoAndStop(2);
delete this.onEnterFrame;
// 使用delete的目的是當完成下載后銷毀onEnterFrame事件,以節(jié)約資源的消耗。
}
};
第2禎的按鈕上的AS
on (press) {
_root.i++;
if (i == 7) {
i = 6;
}
loadMovie("b"+i+".swf", "_root.mc");
_root.tishi = "第"+i+"張圖片";
}
偷點懶,就不詳細的贅述其含義, 我們也可以用很長的語句來實現(xiàn)相同的效果,這種寫法是對AS的一種濃縮。
具體情況請參看原文件。
問題四:我想逐次載入多個外部文件,當?shù)谝粋€載入播放完畢后,立即載入第2個,第二個播放完畢后,立即載入第3個 ,……,直到結(jié)束。怎么辦?
首先對這種提問,我們先要質(zhì)問一下提問的人,這樣做有什么意義? 與其這樣,不如全部做到一個SWF中,因為每次調(diào)用一個外部SWF的時候,需要一定的時間來等待下載。當然,如果你想制作一個連續(xù)劇,播放完了一個后,用londing下一集的londing畫面顯示“正在載入下集,請稍候”那么還是可以的。
方法很簡單:依照問題三的原文件,稍微修改,去掉一個按鈕,用一個按鈕載入第一個,然后再第一個的最后一禎放個調(diào)用主文件中的函數(shù)即可。
按鈕:
on (press) {
loadMovie("b1.swf", "_root.mc");
}
主文件定義的函數(shù)
function go2() {
loadMovie("b2.swf", "_root.mc");
}
function go3() {
loadMovie("b3.swf", "_root.mc");
}
function go4() {
loadMovie("b4.swf", "_root.mc");
}
function go5() {
loadMovie("b5.swf", "_root.mc");
}
function go6() {
loadMovie("b6.swf", "_root.mc");
}
第一個b1 SWF的最后一禎_root. go2(),第二個外部SWF的最后一禎 _root.go3()………..

只需要把圖中的主文件和子文件用比如ftp工具傳到自己的空間上,就可以輕松的實現(xiàn)只下載主文件,如果需要瀏覽的子文件就可以單獨下載,可以想想,如果你的整個FLASH網(wǎng)頁不分主次,全部統(tǒng)一個FLASH,做成了幾M甚至10多M,那么有誰愿意等著看你的網(wǎng)頁呢?除非你自己。
于是使用loadMovie就顯得很重要了?,F(xiàn)在就讓我們從基礎開頭,然后去分析使用loadMovie所涉及到的具體問題吧。使用loadMovie有兩種基本的方法:(一)將外部swf文件載入到某一層上。(二)將外部swf文件載入到時間軸的某個影片剪輯中。對這兩種方法的使用,用圖表示更加直觀些。見圖2-2-2

第二種方法又可以這樣寫:_root.mc.loadMovie(“a1.swf”);如果a1的后綴名為 jpg那么載入的是外部圖片。載入圖片與載入swf文件的道理是一樣的,就不贅述。說到這里還比較空洞,做一個實例來看看。
一、新建一個文件夾,任意取一個名字 比如:mywangye
二、做一個Flash發(fā)布成swf文件并且取名字為a1,保存在mywangye這個目錄中,這個a1就是我們要載入的子文件。
三、然后做主文件,由于我們是做最簡單的,所以什么也不畫,就在這個主文件的第一楨,寫 loadMovie(“a1.swf”,1) 同樣將這個文件保存在mywangye目錄中,取個名字叫index
四、測試效果,源文件見本文后的打包中的01文件夾
然后用上面圖中的第2種語法,繼續(xù)做一個,注意了,第二種方法需要在舞臺上放一個mc并且取一個實例名,或者創(chuàng)建一個空的MC。做了上面的小實驗后,我們可以總結(jié)些什么結(jié)論呢?如果僅僅是得到可以加載外部文件這么一條結(jié)論的話,那么就太膚淺了。可以讓我們想到:被加入進來的外部文件的坐標問題;長寬問題;外部文件比較大,造成的加載延時問題;如何訪問被加載進來的swf的問題;不要加載了,卸載問題…..這些問題我們?nèi)绻谎芯肯?,真正在做網(wǎng)頁的時候,會遇到很多麻煩的。
由上面的最簡單的加載我們可以得到這樣的結(jié)論:(1)如果采用加載到層上的,加載進來后默認注冊點是舞臺的左上角;如果采用加載到mc里面的,那么默認注冊點是MC的注冊點。如果MC的注冊點是左上角,那么被加載進來的SWF文件就與MC的左上角對準;如果MC的注冊點是中心,那么加載進來的SWF就把左上角與MC的中心對齊。(2)被加載進來的MC保留原來的長寬比例。
問題一:如何控制被加載進來的SWF文件的坐標和長寬比例大?。?br>
控制被加載進來的SWF文件控制其長寬要采用onEnterFrame,比如:
on (press) {
loadMovie("a2.swf", "_root.mymc");
onEnterFrame = function () {
_root.mymc._x = 0;
_root.mymc._y = 0;
_root.mymc._width = 330;
_root.mymc._height = 240;
};
}
為什么用 onEnterFrame呢?因為被加載進來的的過程中,有點延時,如果沒有onEnterFrame語句,那么語句讀取一次就不讀取了,然而讀取了這一次之后,還沒有加載進來,所以就會導致坐標大小設置無效。同樣,如果加載到層上,也是這樣的。
on (press) {
loadMovie("a1.swf", 1);
onEnterFrame = function () {
_level1._x = 17;
_level1._y = 30;
_level1._width = 330;
_level1._height = 240;
};
}
請注意這兩種方法,第一種,把外部的a2加載到mymc中,加在進來后,a2就自動的替換了mymc,我們直接設置mymc的屬性就設置了被加載進來的swf的屬性。第二種方法,_level是對于加載到時間軸上的電影的引用,加載到第2層就是_level2;加載到第3層就是_level3。
問題之二:如何實現(xiàn)點擊按鈕加載一個外部SWF文件,并且要顯示加載的下載進度呢?
有兩個方法來實現(xiàn)這個效果,其一:把加載londing寫在主文件中,其二,被加載的子SWF文件有自己的londing?,F(xiàn)在分別給予說明。
其一:在主文件中寫londing
外部子swf文件名為a1,主文件中有一個動態(tài)文本框名為loadText,一個按鈕名為bbt,現(xiàn)在把loadMovie和londing寫在楨上。
_root.bbt.onPress = function() {
_root.createEmptyMovieClip("mc", 10);
mc.loadMovie("a1.swf");
mc._visible = false;
_root.bbt.onEnterFrame = function() {
var l = mc.getBytesLoaded();
var t = mc.getBytesTotal();
var getPercent = l/t;
loadText = Math.round(getPercent*100)+"%";
if (l>0 && l>=t) {
mc._visible = true;
delete this.onEnterFrame;
}
mc._x = 10;
mc._y = 10;
mc._width =440;
mc._height = 320;
};
};
其二:子文件中有自己的londing
這個寫法與前面說的londing一樣,只是注意一個問題就是注意路徑的問題,比如這樣寫:
第一禎
loaded = getBytesLoaded();
total = getBytesTotal();
lts = Math.round((loaded/total)*100);
wenben = lts+"%";
第二禎
if (lts == 100) {
gotoAndStop(3);
} else {
gotoAndPlay(1);
}
和前面的londing中介紹的比較,看出不同之處沒有呢?僅僅是去掉了_root因為被加載后,外部SWF文件就相當于主文件中的一個MC 有了_root 就是指向主文件的_root 了,當然會顯示錯誤。
問題三:我想在舞臺上畫一個屏幕,然后點擊一個按鈕就載入一個外部swf進行播放該怎樣做呢?
那么我們就來一起做一個相冊吧。當主文件載入后,單擊按鈕就載入一個外部swf 文件,并且都有l(wèi)onding顯示。首先我們做好以下準備工作:(1)準備幾張圖片,現(xiàn)在我們準備7張,6個子文件一個一張,主文件用一張。(2)主文件舞臺大小為了適應網(wǎng)頁的需要,設置為770*420。子文件舞臺大小設置為512*384,這樣就不需要載入后控制大小了,方便些(其實我們應當這樣,省去一些麻煩。
一、制作子文件。每個都用來顯示圖片,第一和第二禎寫londing,第三禎~~二十禎根據(jù)自己的愛好做點亮度變化,以產(chǎn)生動感,最后一禎寫上stop()。第一和第二禎的londing如下
第一禎
loaded = getBytesLoaded();
total = getBytesTotal();
lts = Math.round((loaded/total)*100);
wenben = "數(shù)據(jù)下載中 "+lts+"%";
第二禎
if (lts == 100) {
gotoAndPlay(3);
} else {
gotoAndPlay(1);
}
就這樣如法炮制的制作6個,分別命名為b1…..b6都發(fā)布成swf文件。保存在一個文件夾中。
二、制作主文件
第一禎用來寫londing,第2禎放一些像屏幕一樣的東西,和按鈕,為了增加效果,放一個音樂在時間軸上。
第一禎的londing//由于前面已經(jīng)說得多了,就不贅述了
stop();
i = 0; ,
onEnterFrame = function () {
// 使用不斷觸發(fā)的事件
loaded = _root.getBytesLoaded();
total = _root.getBytesTotal();
var aa = Math.round((loaded/total)*100);
_root.dongtai.wenbens = aa+"%";
_root.dongtai._x = 188+aa*3;
_root.bb._width = aa*3;
if (aa>=100) {
// 檢測到滿足條件就跳出來,否則繼續(xù)循環(huán)
_root.gotoAndStop(2);
delete this.onEnterFrame;
// 使用delete的目的是當完成下載后銷毀onEnterFrame事件,以節(jié)約資源的消耗。
}
};
第2禎的按鈕上的AS
on (press) {
_root.i++;
if (i == 7) {
i = 6;
}
loadMovie("b"+i+".swf", "_root.mc");
_root.tishi = "第"+i+"張圖片";
}
偷點懶,就不詳細的贅述其含義, 我們也可以用很長的語句來實現(xiàn)相同的效果,這種寫法是對AS的一種濃縮。
具體情況請參看原文件。
問題四:我想逐次載入多個外部文件,當?shù)谝粋€載入播放完畢后,立即載入第2個,第二個播放完畢后,立即載入第3個 ,……,直到結(jié)束。怎么辦?
首先對這種提問,我們先要質(zhì)問一下提問的人,這樣做有什么意義? 與其這樣,不如全部做到一個SWF中,因為每次調(diào)用一個外部SWF的時候,需要一定的時間來等待下載。當然,如果你想制作一個連續(xù)劇,播放完了一個后,用londing下一集的londing畫面顯示“正在載入下集,請稍候”那么還是可以的。
方法很簡單:依照問題三的原文件,稍微修改,去掉一個按鈕,用一個按鈕載入第一個,然后再第一個的最后一禎放個調(diào)用主文件中的函數(shù)即可。
按鈕:
on (press) {
loadMovie("b1.swf", "_root.mc");
}
主文件定義的函數(shù)
function go2() {
loadMovie("b2.swf", "_root.mc");
}
function go3() {
loadMovie("b3.swf", "_root.mc");
}
function go4() {
loadMovie("b4.swf", "_root.mc");
}
function go5() {
loadMovie("b5.swf", "_root.mc");
}
function go6() {
loadMovie("b6.swf", "_root.mc");
}
第一個b1 SWF的最后一禎_root. go2(),第二個外部SWF的最后一禎 _root.go3()………..
相關文章
Flash ActionScript 中按鈕和電影剪輯的事件和方法
Flash ActionScript 中按鈕和電影剪輯的事件和方法...2007-03-03