loadMovie問題全解

來源:互聯網
上載者:User
問題

使用loadMovie可以動態載入外部檔案,從而減少主檔案的體積,有利於網上下載,以及對各項子檔案的修改,更換。如果沒有做過FLASH網頁,可以看看這個FLASH網頁的基本組成情況,見圖2-2-1

只需要把圖中的主檔案和子檔案用比如ftp工具傳到自己的空間上,就可以輕鬆的實現只下載主檔案,如果需要瀏覽的子檔案就可以單獨下載,可以想想,如果你的整個FLASH網頁不分主次,全部統一個FLASH,做成了幾M甚至10多M,那麼有誰願意等著看你的網頁呢?除非你自己。

於是使用loadMovie就顯得很重要了。現在就讓我們從基礎開頭,然後去分析使用loadMovie所涉及到的具體問題吧。使用loadMovie有兩種基本的方法:(一)將外部swf檔案載入到某一層上。(二)將外部swf檔案載入到時間軸的某個影片剪輯中。對這兩種方法的使用,用圖表示更加直觀些。見圖2-2-2

第二種方法又可以這樣寫:_root.mc.loadMovie(“a1.swf”);如果a1的尾碼名為 jpg那麼載入的是外部圖片。載入圖片與載入swf檔案的道理是一樣的,就不贅述。說到這裡還比較空洞,做一個執行個體來看看。

一、建立一個檔案夾,任意取一個名字 比如:mywangye

二、做一個Flash發布成swf檔案並且取名字為a1,儲存在mywangye這個目錄中,這個a1就是我們要載入的子檔案。

三、然後做主檔案,由於我們是做最簡單的,所以什麼也不畫,就在這個主檔案的第一楨,寫 loadMovie(“a1.swf”,1) 同樣將這個檔案儲存在mywangye目錄中,取個名字叫index

四、測試效果,源檔案見本文後的打包中的01檔案夾

然後用上面圖中的第2種文法,繼續做一個,注意了,第二種方法需要在舞台上放一個mc並且取一個執行個體名,或者建立一個空的MC。做了上面的小實驗後,我們可以總結些什麼結論呢?如果僅僅是得到可以載入外部檔案這麼一條結論的話,那麼就太膚淺了。可以讓我們想到:被加入進來的外部檔案的座標問題;長寬問題;外部檔案比較大,造成的載入延時問題;如何訪問被載入進來的swf的問題;不要載入了,卸載問題…..這些問題我們如果不研究下,真正在做網頁的時候,會遇到很多麻煩的。

由上面的最簡單的載入我們可以得到這樣的結論:(1)如果採用載入到層上的,載入進來後預設註冊點是舞台的左上方;如果採用載入到mc裡面的,那麼預設註冊點是MC的註冊點。如果MC的註冊點是左上方,那麼被載入進來的SWF檔案就與MC的左上方對準;如果MC的註冊點是中心,那麼載入進來的SWF就把左上方與MC的中心對齊。(2)被載入進來的MC保留原來的長寬比例。

問題一:如何控制被載入進來的SWF檔案的座標和長寬比例大小?

控制被載入進來的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。

問題之二:如何?點擊按鈕載入一個外部SWF檔案,並且要顯示載入的下載進度呢?

有兩個方法來實現這個效果,其一:把載入londing寫在主檔案中,其二,被載入的子SWF檔案有自己的londing。現在分別給予說明。

其一:在主檔案中寫londing

外部子swf檔案名稱為a1,主檔案中有一個動態文字框名為loadText,一個按鈕名為bbt,現在把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 檔案,並且都有londing顯示。首先我們做好以下準備工作:(1)準備幾張圖片,現在我們準備7張,6個子檔案一個一張,主檔案用一張。(2)主檔案舞台大小為了適應網頁的需要,設定為770*420。子檔案舞台大小設定為512*384,這樣就不需要載入後控制大小了,方便些(其實我們應當這樣,省去一些麻煩。

一、製作子檔案。每個都用來顯示圖片,第一和第二禎寫londing,第三禎~~二十禎根據自己的愛好做點亮度變化,以產生動感,最後一禎寫上stop()。第一和第二禎的londing如下

第一禎

loaded = getBytesLoaded();
total = getBytesTotal();
lts = Math.round((loaded/total)*100);
wenben = "資料下載中 "+lts+"%";

第二禎

if (lts == 100) {
gotoAndPlay(3);
} else {
gotoAndPlay(1);
}

就這樣如法炮製的製作6個,分別命名為b1…..b6都發布成swf檔案。儲存在一個檔案夾中。

二、製作主檔案

第一禎用來寫londing,第2禎放一些像螢幕一樣的東西,和按鈕,為了增加效果,放一個音樂在時間軸上。

第一禎的londing//由於前面已經說得多了,就不贅述了

stop();
i = 0; ,
onEnterFrame = function () {
// 使用不斷觸發的事件
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) {
// 檢測到滿足條件就跳出來,否則繼續迴圈
_root.gotoAndStop(2);
delete this.onEnterFrame;
// 使用delete的目的是當完成下載後銷毀onEnterFrame事件,以節約資源的消耗。
}
};

第2禎的按鈕上的AS

on (press) {
_root.i++;
if (i == 7) {
i = 6;
}
loadMovie("b"+i+".swf", "_root.mc");
_root.tishi = "第"+i+"張圖片";
}

偷點懶,就不詳細的贅述其含義, 我們也可以用很長的語句來實現相同的效果,這種寫法是對AS的一種濃縮。

具體情況請參看原檔案。

問題四:我想逐次載入多個外部檔案,當第一個載入播放完畢後,立即載入第2個,第二個播放完畢後,立即載入第3個 ,……,直到結束。怎麼辦?

首先對這種提問,我們先要質問一下提問的人,這樣做有什麼意義? 與其這樣,不如全部做到一個SWF中,因為每次調用一個外部SWF的時候,需要一定的時間來等待下載。當然,如果你想製作一個連續劇,播放完了一個後,用londing下一集的londing畫面顯示“正在載入下集,請稍候”那麼還是可以的。

方法很簡單:依照問題三的原檔案,稍微修改,去掉一個按鈕,用一個按鈕載入第一個,然後再第一個的最後一禎放個調用主檔案中的函數即可。

按鈕:

on (press) {
loadMovie("b1.swf", "_root.mc");
}

主檔案定義的函數

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()………..

參看原程式



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。