<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>aw's blog 姿态永恒 &#187; 关于MovieClipLoader的文章</title>
	<atom:link href="http://www.awflasher.com/blog/tag/moviecliploader/feed" rel="self" type="application/rss+xml" />
	<link>http://www.awflasher.com/blog</link>
	<description>分享互联网, 分享人生</description>
	<lastBuildDate>Sun, 29 Jan 2012 11:57:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[技术]原创-完美的loading-完美到底[利器]</title>
		<link>http://www.awflasher.com/blog/archives/468</link>
		<comments>http://www.awflasher.com/blog/archives/468#comments</comments>
		<pubDate>Thu, 23 Mar 2006 16:25:38 +0000</pubDate>
		<dc:creator>aw</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[loading]]></category>
		<category><![CDATA[MovieClipLoader]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[参考英文教程，并作出大量原创补充 &#8211; Neil Webb, neil AT nwebb DOT co DOT uk, http://www.nwebb.co.uk 转载请注明原帖：http://www.awflasher.com/blog/archives/468 2006年12月19日的一个小补充:关于onLoadInit与onLoadComplete的细节对比(文末) 读取外埠数据参与Flash应用程序部署是一件非常重要和常见的工作，尤其是我们常常需要检测这些数据加载的进度。传统的做法是采用loadMovie的方法，不过这种方法需要对被载入的外埠资源进行太多的预先性操作，当外埠资源不可知或者不是swf文件时，loadMovie显得无能为力。而MovieClipLoader(下称MCL)类却帮我们大大简化了这项麻烦工作。此外，它使得我们能获取更多的需要，并减少代码量。我们可以用一个单独的MCL类来载入一个，或者多个外埠资源到指定的MC或者层级，或者我们可以为每一个加载工作制定不同的MCL实例。 我决定分两部分来完成这篇教程。首先，我们将介绍MCL的基本用法；然后我们将介绍如何使用一个单独的MCL实例来读取外埠资源到不同的MC，并且，我们将加入侦听器对象来参与工作。当然，不通过侦听器也可以完成任务，我们暂时不介绍侦听器，因为这样你会更加容易理解MCL。 那么，我们首先来大体了解一下MCL有哪些回调函数，后面也会有详细介绍（aw附:回调函数我个人理解就是某一个类组、参数事先确定，拥有指定功效的方法；再详细点说，从字面上看，所谓回调，就是指先定义好，等某些时刻需要的时候，回过头来调用。也就是特定的事件触发函数）这里可以了解一下什么叫做回调函数）： MovieClipLoader对象的回调函数: 事件回调函数（严格要求数据类型的时候，它们并不是方法，后祥）： * MovieClipLoader.onLoadStart() &#8211; 当加载开始的时候触发 * MovieClipLoader.onLoadProgress() &#8211; 在读取进行中触发 * MovieClipLoader.onLoadInit() &#8211; 读取资源载入后的第一帧执行完成后触发 * MovieClipLoader.onLoadComplete() &#8211; 当读取的外埠资源已经完全下载到本地时触发。 * MovieClipLoader.onLoadError() &#8211; 当加载外埠资源出错时触发。 * MovieClipLoader.unloadClip() &#8211; 将加载的外埠资源移除或终止一个加载工作。 方法回调函数： * MovieClipLoader.getProgress(target:Object):Object &#8211; 读取外埠资源的进展，参数为MC对象(aw附：其实MC这种数据类型也就是一种对象)。返回一个对象，该对象包含两种事先预定好的属性(后祥) 要想好好理解这些回调函数，我们动手试验一下是最好的方法。当然MCL是Flash7之后才有的，所以别忘了发布的时候发布成为7+的版本号。如果直接用FlashPlayer来调试可能会遇到一些问题，我们推荐在浏览器中进行调试（个人意见：对于外埠资源难以获得情况，比如教育网获取公网资源，最好不要在IDE中调试） 在我们的例子中，我们将用一个MCL对象来读取不同的图片，并将它们置入不同的空MC中。本例中要用到的swf文件和图像源文件将在Actionscript.org找到（个人建议：其实看完这篇文章要不要源文件没有必要了） ========== 1、建立一个新的Flash文档，并在第1帧输入以下脚本： _root.traceBox.vScrollPolicy =&#8221;on&#8221;; function [...]]]></description>
			<content:encoded><![CDATA[<p>参考英文教程，并作出大量原创补充 &#8211; Neil Webb, neil AT nwebb DOT co DOT uk, <a href="http://www.nwebb.co.uk" title="http://www.nwebb.co.uk" target="_blank">http://www.nwebb.co.uk</a><br />
转载请注明原帖：<a href="http://www.awflasher.com/blog/archives/468">http://www.awflasher.com/blog/archives/468</a></p>
<p><strong>2006年12月19日的一个小补充:关于onLoadInit与onLoadComplete的细节对比(文末)</strong></p>
<p>读取外埠数据参与Flash应用程序部署是一件非常重要和常见的工作，尤其是我们常常需要检测这些数据加载的进度。传统的做法是采用loadMovie的方法，不过这种方法需要对被载入的外埠资源进行太多的预先性操作，当外埠资源不可知或者不是swf文件时，loadMovie显得无能为力。而MovieClipLoader(下称MCL)类却帮我们大大简化了这项麻烦工作。此外，它使得我们能获取更多的需要，并减少代码量。我们可以用一个单独的MCL类来载入一个，或者多个外埠资源到指定的MC或者层级，或者我们可以为每一个加载工作制定不同的MCL实例。</p>
<p>我决定分两部分来完成这篇教程。首先，我们将介绍MCL的基本用法；然后我们将介绍如何使用一个单独的MCL实例来读取外埠资源到不同的MC，并且，我们将加入侦听器对象来参与工作。当然，不通过侦听器也可以完成任务，我们暂时不介绍侦听器，因为这样你会更加容易理解MCL。</p>
<p>那么，我们首先来大体了解一下MCL有哪些回调函数，后面也会有详细介绍（aw附:回调函数我个人理解就是某一个类组、参数事先确定，拥有指定功效的方法；再详细点说，从字面上看，所谓回调，就是指先定义好，等某些时刻需要的时候，<strong>回过头来调用</strong>。也就是特定的事件触发函数）<a href="http://topic.csdn.net/t/20011227/09/444292.html" title="http://topic.csdn.net/t/20011227/09/444292.html" target="_blank">这里</a>可以了解一下什么叫做回调函数）：<br />
<span id="more-468"></span><br />
MovieClipLoader对象的回调函数:</p>
<p>事件回调函数（严格要求数据类型的时候，它们并不是方法，后祥）：<br />
* MovieClipLoader.onLoadStart() &#8211; 当加载开始的时候触发<br />
* MovieClipLoader.onLoadProgress() &#8211; 在读取进行中触发<br />
* MovieClipLoader.onLoadInit() &#8211; 读取资源载入后的第一帧执行完成后触发<br />
* MovieClipLoader.onLoadComplete() &#8211; 当读取的外埠资源已经完全下载到本地时触发。<br />
* MovieClipLoader.onLoadError() &#8211; 当加载外埠资源出错时触发。<br />
* MovieClipLoader.unloadClip() &#8211; 将加载的外埠资源移除或终止一个加载工作。</p>
<p>方法回调函数：<br />
* MovieClipLoader.getProgress(target:Object):Object &#8211; 读取外埠资源的进展，参数为MC对象(aw附：其实MC这种数据类型也就是一种对象)。返回一个对象，该对象包含两种事先预定好的属性(后祥)</p>
<p>要想好好理解这些回调函数，我们动手试验一下是最好的方法。当然MCL是Flash7之后才有的，所以别忘了发布的时候发布成为7+的版本号。如果直接用FlashPlayer来调试可能会遇到一些问题，我们推荐在浏览器中进行调试（个人意见：对于外埠资源难以获得情况，比如教育网获取公网资源，最好不要在IDE中调试）</p>
<p>在我们的例子中，我们将用一个MCL对象来读取不同的图片，并将它们置入不同的空MC中。本例中要用到的swf文件和图像源文件将在Actionscript.org找到（个人建议：其实看完这篇文章要不要源文件没有必要了）</p>
<p>==========</p>
<p>1、建立一个新的Flash文档，并在第1帧输入以下脚本：</p>
<p class="code">_root.traceBox.vScrollPolicy =&#8221;on&#8221;;<br />
function myTrace(msg)<br />
{<br />
_root.traceBox.text += msg + newline;<br />
_root.traceBox.vPosition = _root.traceBox.maxVPosition;<br />
}</p>
<p>我们这里是在建立一种跟踪调试机制，调试的(变量)将输出到文本框组件中。这里的方法&#8221;myTrace&#8221;是预先定义好的一个函数,它帮助我们顺利完成对某些信息的监控；其中第二句的作用是使文本框随时输出最新监控值。</p>
<p>2、现在从组建库托拽一个TextArea组件进入场景，并给以合适的大小，以及一个实例名称traceBox(对应上面的脚本)</p>
<p>3、接下来，我们要建立一个新的MC元件。并在场景上部署3个实例，为它们分别命名为myMC1,myMC2,myMC3。我们将把图片或者swf影片装载进入它们，并且，在它们下载到本地后按照需求调整它们的尺寸。其实，对图片人为地改变尺寸会造成许多不好的后果，比如锯齿的产生，但是为了让大家了解onLoadInit事件的使用，我们将会这么做。</p>
<p>4、然后，我们建立一个MCL对象，在第一帧输入以下脚本：</p>
<p class="code">var myMCL = new MovieClipLoader();//create an instance of MovieClipLoader</p>
<p>aw附：这里我想罗索以下，关于Object的翻译。因为上述代码的注释中，老外用的是instance这个词，直译的话，Object是“对象”；Instance代表“实例”。前者更注重于其数据类型，而后者则更注重于其客观存在性。</p>
<p>5、现在我们就可以部署脚本了，在第一帧：</p>
<p class="code">myMCL.onLoadStart = function (targetMC)<br />
{<br />
var loadProgress = myMCL.getProgress(targetMC);<br />
myTrace (&#8220;The movieclip &#8221; + targetMC + &#8221; has started loading&#8221;);<br />
myTrace(&#8220;Bytes loaded at start=&#8221; + loadProgress.bytesLoaded);<br />
myTrace(&#8220;Total bytes loaded at start=&#8221; + loadProgress.bytesTotal);<br />
}</p>
<p>这个函数的第一行中申明了一个(对象类型的)变量，显然，这个变量的值由myMCL对象的getProgress方法获得.刚才已经介绍了getProgress方法,这里可以看到,返回的loadProgress.bytesLoaded就是loadProgress对象的bytesLoaded属性.<br />
这里我在啰嗦一句：为什么返回一个对象，而不返回具体的值。这是有原因的。函数返回值的功能使得程序设计更加完美，然而很多情况下，我们要返回的并非一个值，我们可能返回两个或者更多的值，甚至它们的数据类型都不相同。这样，只有通过对象的形式来返回了。这是解决问题最简单最高效的方法。下面三句myTrace就呼应了之前我们定义的监控函数，这样就能看到我们关注的变量了。</p>
<p>6、我们已经为onLoadStart事件部署了相应的工作，接下来我们要为上述其他事件部署工作了。紧接着是onLoadProgress，它接受三个参数：targetMC, loadedBytes, totalBytes。分别代表目标容器MC实例；已经读取的体积、总体积。</p>
<p class="code">myMCL.onLoadProgress = function (targetMC, loadedBytes, totalBytes) {<br />
myTrace (&#8220;movie clip: &#8221; + targetMC);<br />
myTrace(&#8220;Bytes loaded at progress callback=&#8221; + loadedBytes);<br />
myTrace(&#8220;Bytes total at progress callback=&#8221; + totalBytes);<br />
}</p>
<p>7、我们的onLoadComplete方法仅接受一个参数，它就是容器MC实例。像onLoadStart一样，我们用getProgress方法来返回读取情况。</p>
<p class="code">myMCL.onLoadComplete = function (targetMC)<br />
{<br />
var loadProgress = myMCL.getProgress(targetMC);<br />
myTrace (targetMC + &#8221; has finished loading.&#8221;);<br />
myTrace(&#8220;Bytes loaded at end=&#8221; + loadProgress.bytesLoaded);<br />
myTrace(&#8220;Bytes total at end=&#8221; + loadProgress.bytesTotal);<br />
}</p>
<p>8、onLoadInit方法将在所有加载的内容被下载到本地容器MC中之后才开始执行。这将使得你能更好的控制加载进来的内容的属性。我选择的图片非常大，这样我们可以把读取过程看得更加清晰，而我也要对已经加载的图片尺寸进行修整，让它能全部显示出来。</p>
<p class="code">myMCL.onLoadInit = function (targetMC)<br />
{<br />
myTrace (&#8220;Movie clip:&#8221; + targetMC + &#8221; is now initialized&#8221;);<br />
targetMC._width = 170;<br />
targetMC._height = 170;<br />
}</p>
<p>9、还有一个回调方法onLoadError。如果有错误发生，它将会被触发。作为一个优秀的程序员，部署完善的应用程序的时候，对错误发生的避免措施是必不可少的！</p>
<p class="code">myMCL.onLoadError = function (targetMC, errorCode)<br />
{<br />
myTrace (&#8220;ERRORCODE:&#8221; + errorCode);<br />
myTrace (targetMC + &#8220;Failed to load its content&#8221;);<br />
}</p>
<p>10、我们终于将最复杂的工作部署好了。接下来我们只用使用loadClip方法读入我们需要的内容就行了。loadClip方法的两个参数分别是<strong>外埠资源的地址</strong>和<strong>容器MC的实例</strong>。</p>
<p class="code">myMCL.loadClip(&#8220;http://www.yourdomain.com/test1.swf&#8221;,&#8221;_root.myMC1&#8243;);<br />
myMCL.loadClip(&#8220;http://www.yourdomain.com/test2.swf &#8220;, &#8220;_root.myMC2&#8243;);<br />
myMCL.loadClip(&#8220;http://www.yourdomain.com/pic.jpg&#8221;, &#8220;_level0.myMC3&#8243;);</p>
<p>路径可以选择相对路径。注意，路径的相对性也是一个大问题，当SWF在非本路径的HTML中被引用的时候，遵从HTML所在的路径！这一点是很多Flash教程都忽视的。所以，有时候绝对路径也有绝对路径的好处。[路径问题源文件下载，下载了就一目了然了]</p>
<p>所有的调试工作最好在浏览器中，而非IDE中完成。而且脚本输出方式必须是AS2。</p>
<p>接下来，我将介绍实时调用MCL的情况。为了能适应更多的应用，我们经常动态地为MCL制定工作。</p>
<p>aw画外音：有时候，我们如此写：<br />
1、var mcl:MovieClipLoader = new MovieClipLoader ();<br />
2、var mcl = new MovieClipLoader ();<br />
发现第一种写法无法为MCL制定onLoadStart等事件方法。这是编译器根据指定变量的数据类型产生的问题。osflash的一些朋友给了一些有用的观点，我也发现这个问题正好涉及到Flash内部的事件响应机制，不妨介绍一下：<br />
Flash的三种事件响应机制<br />
=====<br />
1、简单的回调函数，最老的；<br />
2、侦听器，ASBroadcaster，FlashMX时代；<br />
3、事件侦听器，EventDispather，FlashMX2004时代</p>
<p>这里，MCL用的是第二种机制，而整套V2组件则使用最后一套机制。<br />
附：MCL官方申明，注意：上述方法中，仅包含getProgress方法！</p>
<p class="code">intrinsic class MovieClipLoader<br />
{<br />
function MovieClipLoader();  function addListener(listener:Object):Boolean;<br />
function getProgress(target:Object):Object;<br />
function loadClip(url:String, target:Object):Boolean;<br />
function removeListener(listener:Object):Boolean;<br />
function unloadClip(target:Object):Boolean;<br />
}</p>
<p>个人补充认为，1、2在不严格要求数据类型的时候可以通用。</p>
<p>下面开始介绍用侦听器来检测MCL事件的方法。在此之前，我们解决一个最常见的问题，我们经常会在论坛中看到有人这样提问：</p>
<p class="quote">&nbsp;</p>
<p class="quote-title">引用自 <u></u></p>
<p class="quote-content">大家好，我动态地建立了一些MC，并逐个分配给它们一个事件句柄（标志）。然后，我将外埠资源读取到它们之中。但是这些分配好的事件句柄都不工作了！</p>
<p>紧接着，发问人一般会贴出一对乱七八糟的代码，并大呼救命。</p>
<p>那么，我们首先来分析一下这个错误发生的原因：当外埠资源被载入到一个MC中时，这个MC将会重新初始化。这意味着任何被预先制定好的代码都将付之东流。对于开发人员已经手动在舞台上安排好的MC则并没有相关的麻烦，这是因为任何直接通过onClipEvent制定到MC的代码都能幸免被重新初始化。而动态建立的MC则进行上述的“初始化”，因为我们是在运行中给它们配置的事件代码。</p>
<p>我们如何避免这个问题呢？其实方法太多了，很多论坛也进行了极为详细的讨论，我就不多赘述了。</p>
<p>你现在也许还记得刚才我介绍的“读取外埠数据参与Flash应用程序部署是一件非常重要和常见的工作，尤其是我们常常<strong>需要检测这些数据加载的进度</strong>”</p>
<p>我们已经介绍了MCL的几个回调函数，所以这里也不再赘述了。我们现在制作这样一个效果：缩略图标式的图片浏览系统。我们将要从外部读取一些JPG图片，将它们放入我们动态部署的MC中。并且我们希望这些动态建立的MC都具有各自的onPress事件。我们通过在MC装载好外部资源之后再为之分配事件。</p>
<p>在我们开始之前，我还想提醒大家注意一些经常出现的疏漏：一定要在发布的时候设置成Flash7+AS2以上的版本；其次，用浏览器测试你的效果，而不是IDE；否则你将会得到奇怪的结果。</p>
<p>现在，我们开始编制代码，你会发现它比你想象的要简单得多。</p>
<p>1、新建一个Flash文档。</p>
<p>2、找四张100*100像素的缩略图片。</p>
<p>3、建立一个动态文本框，大概在300*300像素左右，使用12号字体，并使之现实边框，这样我们更好监测。别忘了设置它为多行的。</p>
<p>4、建立一个100X100像素的矩形，转变为MC，然后将它移出场景。这时候，他已经出现在库中了。在库中，设置他的链接名为“img”，并使其“在第一帧导出”。其实这个矩形会在外部资源载入的时候被取代，现在只是为了调试方便。</p>
<p>5、在刚才放置textBox文本框的层之上新建一层，这一层用于放置我们的代码，先写上</p>
<p class="code">stop();</p>
<p>6、现在我们定义一个MCL的实例，此外定义一个基本对象，作为我们的侦听器：</p>
<p class="code">myMCL = new MovieClipLoader();  //define MovieClipLoader<br />
myListener = new Object();      //define listener</p>
<p>7、接下来我们用侦听器来侦听onLoadComplete事件，该事件的作用上文已经提到了。我们现在把它交给listener对象，而不是MCL实例。当然，最终要把侦听器对象再交回MCL（以侦听其回调函数）的时候，得到的效果就是我们需要的效果了。</p>
<p>记住，只有当读取完毕的时候，对MC部署事件任务才是安全可靠的！所以，在onLoadComplete被触发的时候才部署这个onPress事件给MC:</p>
<p class="code">myListener.onLoadComplete = function(targetMC){<br />
debug.text += &#8220;LOADING OF &#8221; + targetMC<br />
+ &#8221; COMPLETE&#8221; + newline;<br />
targetMC.onPress = function() {<br />
debug.text += newline<br />
+ &#8220;targetMC = &#8221; + targetMC._name;<br />
}<br />
}</p>
<p>注：上述代码中有几行被人为打断，但这并不影响效果。</p>
<p>你也许已经注意到了，MC的实例名称在onLoadComplete被触发的时候是作为一个参数的身份传递给onLoadComplete的，这样我们控制这个MC就非常方便了。比如这里就可以用点击MC来检测事件是否被成功部署给MC。</p>
<p>8、现在我们建立一个函数，它包含一个简单的循环来部署场景上的MC。并且及时地为每一个部署好的MC分配读取外埠资源的任务（loadClip方法），代码如下：</p>
<p class="code">function initClips(){<br />
for (i=1; i&lt;=4; i++){<br />
this.attachMovie(&#8220;img&#8221;, &#8220;img&#8221; + i, i);<br />
this["img"+i]._x = i*110;<br />
myMCL.loadClip(&#8220;0&#8243; + i + &#8220;.jpg&#8221; ,this["img"+i]);<br />
}<br />
}</p>
<p>9、到这里基本上就完成了。现在我们剩下的工作就是注册侦听器并且按照需求调用相关函数、方法，反映到代码上就是以下两行：</p>
<p class="code">myMCL.addListener(myListener);<br />
initClips();</p>
<p>注意这里的顺序，我们的侦听器对象在调用initClip()函数之前就被作用于MCL实例了。现在我们的MC的onPress事件可以顺利工作了，因为当图片被完全读入之后，事件才被分配过去。我们的代码也非常简洁。我们再也不用为了loading而去制作麻烦的循环了，MovieClipLoader帮我们完成了所有工作！</p>
<p>附：完整代码如下：</p>
<p class="code">stop();<br />
myMCL = new MovieClipLoader();<br />
myListener = new Object();<br />
myListener.onLoadComplete = function(targetMC)<br />
{<br />
targetMC.onPress = function ()<br />
{<br />
trace(&#8220;pressed&#8221;);<br />
}<br />
}function initClips()<br />
{<br />
for (i=1;i&lt;=4;i++)<br />
{<br />
this.attachMovie(&#8220;img&#8221;,&#8221;img&#8221;+i,i);<br />
this["img"+i$]$._x = i*110;<br />
myMCL.loadClip(url,this["img"+i$]$);<br />
}<br />
}<br />
myMCL.addListener(myListener);<br />
initClips();</p>
<p>到此为止，你应该相信MCL确实是一个不可多得的好东西了吧？：）</p>
<p>PS:</p>
<p class="quote">&nbsp;</p>
<p class="quote-title">引用自 <u>lzyy@blueidea.com</u></p>
<p class="quote-content">个人觉得loadMovieClip 类,用来加载图片效果不错,但如果加载flash的话则很容易出问题,flash8+maxthon+256 RAM memory下测试,每次载入flash时,都会导致maxthon卡死,而换作图片时,效果却非常如意,所以个人推荐导入图片时用loadMovieClip类，而导入flash时还是用第二种方法比较好！刚刚又测试了一下，loadMovieClip类用来加载flash，效果也是不错的，只要加一句System.security.allowDomain(&#8220;<a href="http://www.yourdomain.com" title="http://www.yourdomain.com" target="_blank">http://www.yourdomain.com</a>&#8220;);就行了 ：）</p>
<p>aw回：目前我还没有作相关测试，但对于&#8221;System.security.allowDomain&#8221;，我确实钻研的还不够，有机会好好看看……</p>
<p>补充：我所遇到的MovieClipLoader的灵异事件：<br />
1、对于从外部读取的SWF，结合HTML中wmode=transparent时，按键无响应<br />
2、调试时必须加“./”方可载入图片</p>
<p>=========================</p>
<p>本系列文章：<br />
1 &#8211; [技术]原创-完美的loading-完美到底[基础]<br />
<a href="http://www.awflasher.com/blog/archives/444">http://www.awflasher.com/blog/archives/444</a><br />
结合原理介绍loading基础。</p>
<p>2 &#8211; [技术]原创-完美的loading-完美到底[利器]<br />
<a href="http://www.awflasher.com/blog/archives/468">http://www.awflasher.com/blog/archives/468</a><br />
详细介绍MovieClipLoader类的使用，以及一些原理。</p>
<p>3 &#8211; [技术]原创-完美的loading-完美到底[减负]<br />
<a href="http://www.awflasher.com/blog/archives/470">http://www.awflasher.com/blog/archives/470</a><br />
主要解决v2组件相关的loading，原文附图，至此，系列教程结束，应该不会再有loading的麻烦了！：）</p>
<p>~ 补充<br />
关于onLoadInit与onLoadComplete的细节对比</p>
<p>Macromedia推出MovieClipLoader这样一个功能强大的武器时，却不慎犯下了一个“文不对题”的低级错误(参考<a href="http://whatdoiknow.org/archives/001982.shtml" title="http://whatdoiknow.org/archives/001982.shtml" target="_blank">When complete is not complete</a>)<br />
onLoadInit与onLoadComplete这两个事件的功效与它们的名字并不相同。<br />
包括我自己之前都没有注意这个问题，只是一味的采用onLoadInit来进行应用部署。今天在给<a href="http://www.awflasher.com/blog/tag/白云黄鹤" title="白云黄鹤">白云黄鹤</a>首页进行改进的时候，发现自己居然用了onLoadComplete，也不知道那时候是出于什么考虑（因为我的习惯一直不用complete而是init）。于是进行了大搜索，找到了上面的文章(When complete is not complete)。</p>
<p>onLoadComplete，字面上是载入已经完成，但实际上，仅仅是下载完成而已。载入的物件，尤其是swf，并没有得到实例化，因而在此，你并不能得到它的各类属性，也不能对它施放命令。<br />
onLoadInit，字面上意思是载入初始化完成，但实际上，在这个callback function被执行前它并不会显示在舞台上。</p>
<p>原文最后一段颇有意思</p>
<p class="quote">&nbsp;</p>
<p class="quote-title">引用自 <u></u></p>
<p class="quote-content">So you see, &#8216;Complete&#8217; is not really complete, just on the verge of completing. Like a person knocking on your door, ready to come in, but you can&#8217;t see who it is or what they look like.</p>
<p>你看看，“完成”并不是真正的“完成”，只是在将要完成的那一刻。就好像一个人来瞧你的门，准备进来，但你却不知道他是什么样子一样~:)</p>
<div style="border-top:1px dotted #ddd;width:100%;margin:5px 0"></div>
<p>
<strong>
<a href="http://www.awflasher.com/blog/archives/468#awcomment"><strong>3</strong>条评论</a>,
<a href="http://www.awflasher.com/blog/archives/468#awcomment">立即发言</a>
</strong>
|
本文关键词: <a href="http://www.awflasher.com/blog/tag/loading" rel="tag">loading</a>, <a href="http://www.awflasher.com/blog/tag/moviecliploader" rel="tag">MovieClipLoader</a>, <a href="http://www.awflasher.com/blog/tag/%e6%95%99%e7%a8%8b" rel="tag">教程</a><br/></p>
<p>©<a href="http://www.awflasher.com/blog" title="aw's blog 姿态永恒">aw's blog 姿态永恒</a> 1984-2006  | <a href="http://www.awflasher.com/blog/archives/468">链接地址</a> - http://www.awflasher.com/blog/archives/468
</p>
<p><a style="color:#cc0000;background:#ffffaa;font-weight:bold" href="http://weibo.com/awguo">@awguo （新浪微博）</a> | <a style="color:#cc0000;background:#ffffaa;font-weight:bold" href="http://t.qq.com/awguo">@awguo （腾讯微博）</a> | <a style="color:#cc0000;background:#ffffaa;font-weight:bold" href="https://twitter.com/awguo">Twitter: @awguo</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.awflasher.com/blog/archives/468/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[技术]原创-完美的loading-完美到底[基础]</title>
		<link>http://www.awflasher.com/blog/archives/444</link>
		<comments>http://www.awflasher.com/blog/archives/444#comments</comments>
		<pubDate>Thu, 23 Mar 2006 16:24:50 +0000</pubDate>
		<dc:creator>aw</dc:creator>
				<category><![CDATA[web开发]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[loading]]></category>
		<category><![CDATA[MovieClipLoader]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[很久没有发技术日志了，要来就来个完美的。您别激动，一个小小的loading谈什么完美，我想你看了就知道^_^ 我的口号，将此文打造成全球最完善的非Flash初学者loading教程贴。转载请保留原文地址： http://www.awflasher.com/blog/archives/444 首先，想说一下我写此文的动机。记得很早之前我曾经说过“没有loading的flash，不是完整的flash”。我想那个句话可能偏激了。因为有时候一些不到10k的flash，确实不需要做什么loading。但我始终认为，做一个优秀的loading是衡量一个flasher水准，甚至态度的。你问我为什么，我可以告诉你，因为loading是唯一一个你不会多看而所有用户、客户会看的东西，所以你对loading的重视程度，甚至可以反衬你这个flasher的职业道德！ 有些做设计为主的朋友，我认识不少，他们对loading都是得过且过的态度，做一个loading，更多的是自己找一个现成的，然后每次去套用，我个人认为是很不好的习惯。并不是说我不提倡代码、元件的重用度，而是我觉得对于loading这种东西，套多了，是要出问题的。我强烈建议那些已经达到可以修改人家loading水平的flasher看看我的东西，当然，如果你连flash的as该写在哪都不知道，建议先入门了。 好，下面切入正题，如何制作loading。 首先要感激Macromedia的大智慧，提供了很好的两个函数使我们可以做出完美的loading，那就是getBytesLoaded和getBytesTotal。请不要再用你改来改去改了两三年的那个什么getFrameLoaded什么什么了，我都记不清楚怎么拼了。我只想说，Frame的观念将在真正的Interactive-Design中淡化。更别提什么Scene，那是Flash的败笔！ 那么loading如何工作呢？我们如何利用这两个函数呢？这里要提到一个重要的概念。就是间隔调用。间隔调用有多种方式，下面列举出来，并列举出其在loading制作中的地位和用法，欢迎补充： ·setInterval方式 写法： function loadCheck() { var p = getBytesLoaded()/getBytesTotal(); if (p==1) { clearInterval(intervalID); // 释放间隔调用 gotoAndPlay(someFrame); // 开始播放 } } var interval = 30; // 这个数值是刷新频率 var intervalID = setInterval(loadCheck,interval); 我个人并不推荐初学者用这种写法。因为很多人容易忽视clearInterval，而这个东西被忽视掉，是很恐怖的！如果你的setInterval没有给及时移除，意味着你将在整个swf的播放过程中增加一个没有必要的负担！ 而且这种方法很不适合控制MoiveClip的状况（因为初学者会发现MC的路径是个大问题，而loadCheck本身就是个函数，还是被setInterval调用的，要在loadCheck中指一个路径出来，挺麻烦的，你不要指望_root，那样会让你的程序不规范；也不要指望this，因为在函数中用this似乎不太理想；最好什么都不写，但往往你不敢不写），进而做出更好的效果。 ·onEnterFrame方式 我最喜欢的就是这种方法了。比较方便、直观。 因为往往我们是要用一个MC体现一个loading的进度，比如，一个进度条，或者更有创意的东西，只有你不能想到的，没有你不能做到的。 那么究竟如何用呢。首先，把创意定好。然后给你的MC一个实例名字，比如叫做loader_mc。这时候在timeline上写代码，记住，是timeline而不是MC上。因为这样便于代码统一、便于路径统一、便于管理和寻找。别为了省几个字母就把代码通通搬到button，mc上面去，然后一个on(press)了事。除非你是在敷衍你的作品；或者你是在为了交作业。 loader_mc.onEnterFrame = function () { var getTar:MovieClip = this._parent; var p [...]]]></description>
			<content:encoded><![CDATA[<p>很久没有发技术日志了，要来就来个完美的。您别激动，一个小小的loading谈什么完美，我想你看了就知道^_^<br />
我的口号，将此文打造成全球最完善的非Flash初学者loading教程贴。转载请保留原文地址：<br />
<a href="http://www.awflasher.com/blog/archives/444" title="Flash loading 教程">http://www.awflasher.com/blog/archives/444</a></p>
<p>首先，想说一下我写此文的动机。记得很早之前我曾经说过“没有loading的flash，不是完整的flash”。我想那个句话可能偏激了。因为有时候一些不到10k的flash，确实不需要做什么loading。但我始终认为，<strong>做一个优秀的loading是衡量一个flasher水准，甚至态度的。你问我为什么，我可以告诉你，因为loading是唯一一个你不会多看而所有用户、客户会看的东西，所以你对loading的重视程度，甚至可以反衬你这个flasher的职业道德！</strong></p>
<p>有些做设计为主的朋友，我认识不少，他们对loading都是得过且过的态度，做一个loading，更多的是自己找一个现成的，然后每次去套用，我个人认为是很不好的习惯。并不是说我不提倡代码、元件的重用度，而是我觉得对于loading这种东西，套多了，是要出问题的。我强烈建议那些已经达到可以修改人家loading水平的flasher看看我的东西，当然，如果你连flash的as该写在哪都不知道，建议先入门了。</p>
<p>好，下面切入正题，如何制作loading。</p>
<p>首先要感激<a href="http://www.awflasher.com/blog/tag/Macromedia" title="Macromedia">Macromedia</a>的大智慧，提供了很好的两个函数使我们可以做出完美的loading，那就是getBytesLoaded和getBytesTotal。请不要再用你改来改去改了两三年的那个什么getFrameLoaded什么什么了，我都记不清楚怎么拼了。我只想说，<span id="more-444"></span>Frame的观念将在真正的Interactive-Design中淡化。更别提什么Scene，那是Flash的败笔！</p>
<p>那么loading如何工作呢？我们如何利用这两个函数呢？这里要提到一个重要的概念。就是间隔调用。间隔调用有多种方式，下面列举出来，并列举出其在loading制作中的地位和用法，欢迎补充：</p>
<p>·<a href="http://www.awflasher.com/blog/tag/setInterval" title="setInterval">setInterval</a>方式<br />
写法：</p>
<p class="code">function loadCheck()<br />
{<br />
var p = getBytesLoaded()/getBytesTotal();<br />
if (p==1)<br />
{<br />
clearInterval(intervalID); // 释放间隔调用<br />
gotoAndPlay(someFrame); // 开始播放<br />
}<br />
}<br />
var interval = 30; // 这个数值是刷新频率<br />
var intervalID = setInterval(loadCheck,interval);</p>
<p>我个人并不推荐初学者用这种写法。因为很多人容易忽视clearInterval，而这个东西被忽视掉，是很恐怖的！如果你的setInterval没有给及时移除，意味着你将在整个swf的播放过程中增加一个没有必要的负担！<br />
而且这种方法很不适合控制MoiveClip的状况（因为初学者会发现MC的路径是个大问题，而loadCheck本身就是个函数，还是被setInterval调用的，要在loadCheck中指一个路径出来，挺麻烦的，你不要指望_root，那样会让你的程序不规范；也不要指望this，因为在函数中用this似乎不太理想；最好什么都不写，但往往你不敢不写），进而做出更好的效果。</p>
<p>·<a href="http://www.awflasher.com/blog/tag/onEnterFrame" title="onEnterFrame">onEnterFrame</a>方式<br />
我最喜欢的就是这种方法了。比较方便、直观。<br />
因为往往我们是要用一个MC体现一个loading的进度，比如，一个进度条，或者更有创意的东西，只有你不能想到的，没有你不能做到的。<br />
那么究竟如何用呢。首先，把创意定好。然后给你的MC一个实例名字，比如叫做loader_mc。这时候在timeline上写代码，记住，是timeline而不是MC上。因为这样便于代码统一、便于路径统一、便于管理和寻找。别为了省几个字母就把代码通通搬到button，mc上面去，然后一个on(press)了事。除非你是在敷衍你的作品；或者你是在为了交作业。</p>
<pre class="code">
loader_mc.onEnterFrame = function ()
{
var getTar:MovieClip = this._parent;
var p = getTar.getBytesLoaded()/getTar.getBytesTotal();
trace(p);
if(p==1)
{
//this.onEnterFrame = null;(感谢jimohuoshan@BI提醒,不用null改用delete,原理~ http://www.luar.com.hk/flashbook/archives/001150.php)
delete this.onEnterFrame; // 注意是delete
gotoAndPlay(someFrame); // 开始播放
}}</pre>
<p>就这么简单，记住，在MC的事件函数体内部引用MC，永远是一件很快的事情。因为this就可以指向这个MC本身，通过诸如this._parent之类的方法，可以找到你所有的MC!</p>
<p>·直接依赖于timeline的循环方式<br />
非常非常非常古老的方式了，不介绍了。不过你们可以去问问那些一直不喜欢自己动手做loading的flasher，他们也许在改的某一个版本就是这个，呵呵。</p>
<p>以上算是比较简单的。比较容易出问题的，还有两个。<br />
第一、MovieClipLoader<br />
第二、含有多种V2组件的Loader</p>
<p>我买了回学校的火车票就继续写，哈哈<br />
要是嫌不够，可以看我原创的这个loading特效，<a href="http://www.awflasher.com/blog/archives/374" title="源码">源码</a></p>
<p>本系列文章：<br />
1 &#8211; [技术]原创-完美的loading-完美到底[基础]<br />
<a href="http://www.awflasher.com/blog/archives/444">http://www.awflasher.com/blog/archives/444</a><br />
结合原理介绍loading基础。</p>
<p>2 &#8211; [技术]原创-完美的loading-完美到底[利器]<br />
<a href="http://www.awflasher.com/blog/archives/468">http://www.awflasher.com/blog/archives/468</a><br />
详细介绍MovieClipLoader类的使用，以及一些原理。</p>
<p>3 &#8211; [技术]原创-完美的loading-完美到底[减负]<br />
<a href="http://www.awflasher.com/blog/archives/470">http://www.awflasher.com/blog/archives/470</a><br />
主要解决v2组件相关的loading，原文附图，至此，系列教程结束，应该不会再有loading的麻烦了！：）</p>
<div style="border-top:1px dotted #ddd;width:100%;margin:5px 0"></div>
<p>
<strong>
<a href="http://www.awflasher.com/blog/archives/444#awcomment"><strong>22</strong>条评论</a>,
<a href="http://www.awflasher.com/blog/archives/444#awcomment">立即发言</a>
</strong>
|
本文关键词: <a href="http://www.awflasher.com/blog/tag/flash" rel="tag">Flash</a>, <a href="http://www.awflasher.com/blog/tag/loading" rel="tag">loading</a>, <a href="http://www.awflasher.com/blog/tag/moviecliploader" rel="tag">MovieClipLoader</a>, <a href="http://www.awflasher.com/blog/tag/%e6%95%99%e7%a8%8b" rel="tag">教程</a><br/></p>
<p>©<a href="http://www.awflasher.com/blog" title="aw's blog 姿态永恒">aw's blog 姿态永恒</a> 1984-2006  | <a href="http://www.awflasher.com/blog/archives/444">链接地址</a> - http://www.awflasher.com/blog/archives/444
</p>
<p><a style="color:#cc0000;background:#ffffaa;font-weight:bold" href="http://weibo.com/awguo">@awguo （新浪微博）</a> | <a style="color:#cc0000;background:#ffffaa;font-weight:bold" href="http://t.qq.com/awguo">@awguo （腾讯微博）</a> | <a style="color:#cc0000;background:#ffffaa;font-weight:bold" href="https://twitter.com/awguo">Twitter: @awguo</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.awflasher.com/blog/archives/444/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>

