<?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>blog.log2e.com &#187; Preloader</title>
	<atom:link href="http://blog.log2e.com/tag/preloader/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.log2e.com</link>
	<description>Tutorials and Code Snippets</description>
	<lastBuildDate>Tue, 25 May 2010 12:47:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Spinning Preloader &#8211; An All-Time Classic in Pure AS3</title>
		<link>http://blog.log2e.com/2008/05/10/spinning-preloader-in-pure-as3/</link>
		<comments>http://blog.log2e.com/2008/05/10/spinning-preloader-in-pure-as3/#comments</comments>
		<pubDate>Sat, 10 May 2008 14:56:48 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashDevelop]]></category>
		<category><![CDATA[Preloader]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=14</guid>
		<description><![CDATA[Update (December 11th, 2008): The source code is available for download now. The zip archive also includes a FlashDevelop project file. Get it here. This tutorial may serve as a beginner exercise in AS3 coding. But before starting, let&#8217;s take a quick look at what we will be creating: 
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_spinningpreloader_1013237909"
			class="flashmovie"
			width="400"
			height="140">
	<param name="movie" value="http://blog.log2e.com/wp-content/uploads/2008/05/spinningpreloader.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.log2e.com/wp-content/uploads/2008/05/spinningpreloader.swf"
			name="fm_spinningpreloader_1013237909"
			width="400"
			height="140">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object> The [...]]]></description>
			<content:encoded><![CDATA[<p><em>Update (December 11th, 2008): The source code is available for download now. The zip archive also includes a FlashDevelop project file. <a href="http://blog.log2e.com/demos/spinning-preloader/SpinningPreloader.zip">Get it here</a>.</em></p>
<p>This tutorial may serve as a beginner exercise in AS3 coding. But before starting, let&#8217;s take a quick look at what we will be creating:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_spinningpreloader_1803803751"
			class="flashmovie"
			width="400"
			height="140">
	<param name="movie" value="http://blog.log2e.com/wp-content/uploads/2008/05/spinningpreloader.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.log2e.com/wp-content/uploads/2008/05/spinningpreloader.swf"
			name="fm_spinningpreloader_1803803751"
			width="400"
			height="140">
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>The spinning preloader animation is an all-time classic. Our implementation will be highly configurable. You will be able to set the number, size, color and fade-out duration of the rectangular segments, as well as the radius and the spinning speed.<br />
<span id="more-14"></span></p>
<h3>Prerequisites</h3>
<p>Since this is a pure AS3 project, you can choose whatever IDE you like. I use the open-source AS3 IDE <a title="FlashDevelop" href="http://www.flashdevelop.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.flashdevelop.org/?referer=');">FlashDevelop</a> along with the free <a title="Flex 3 SDK" href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK" target="_blank" onclick="pageTracker._trackPageview('/outgoing/opensource.adobe.com/wiki/display/flexsdk/Flex+SDK?referer=');">Flex 3 SDK</a>. The only other thing we need is the AS3 animation kit <a title="TweenLite" href="http://blog.greensock.com/tweenliteas3/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/blog.greensock.com/tweenliteas3/?referer=');">TweenLite</a>. This lightweight tweening engine is contained in a single class file. You can eiher copy and paste it into your project space, or you can store it somewhere else and add the path to your project&#8217;s classpaths settings.</p>
<p>I call the preloader class <em>SpinningPreloader</em> and use <em>com.log2e.utils</em> as package definition. So my FlashDevelop project panel looks like this:</p>
<p><img style="border: 0pt none; margin: 0px;" src="http://blog.log2e.com/wp-content/uploads/2008/05/spinning_preloader_project_panel.gif" alt="Spinning Preloader Project Panel" width="427" height="224" /></p>
<h3>The <em>SpinningPreloader</em> Class</h3>
<p>Here&#8217;s the full class code (I will explain it below):</p>
<div class="geshi actionscript">
<ol>
<li class="li1">
<div class="de1">package com.<span class="kw3">log2e</span>.<span class="me1">utils</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">DisplayObjectContainer</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">Sprite</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">TimerEvent</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">utils</span>.<span class="me1">Timer</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> gs.<span class="me1">TweenLite</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">class</span> SpinningPreloader <span class="kw3">extends</span> Sprite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> <span class="kw3">_target</span> <img src='http://blog.log2e.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> isplayObjectContainer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _container:Sprite;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _centerX:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _centerY:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _radius:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _steps:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _rectWidth:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _rectHeight:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _color:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _count:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _timer:Timer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _timerInterval:uint;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> _fadeOutDuration:<span class="kw3">Number</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> SpinningPreloader<span class="br0">&#40;</span> <span class="kw3">target</span> <img src='http://blog.log2e.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> isplayObjectContainer,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;centerX:uint = <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;centerY:uint = <span class="nu0">0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;radius:uint = <span class="nu0">15</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;steps:uint = <span class="nu0">24</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rectWidth:uint = <span class="nu0">4</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rectHeight:uint = <span class="nu0">2</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">color</span>:uint = 0x0000FF,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;timerInterval:uint = <span class="nu0">20</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fadeOutDuration:<span class="kw3">Number</span> = <span class="nu0">1.5</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">_target</span> = <span class="kw3">target</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_centerX = centerX;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_centerY = centerY;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_radius = radius;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_steps = steps;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_rectWidth = rectWidth;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_rectHeight = rectHeight;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_color = <span class="kw3">color</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_timerInterval = timerInterval;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_fadeOutDuration = fadeOutDuration;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_container = <span class="kw2">new</span> Sprite<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_container.<span class="me1">x</span> = _centerX;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_container.<span class="me1">y</span> = _centerY;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">_target</span>.<span class="me1">addChild</span><span class="br0">&#40;</span>_container<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_count = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_timer = <span class="kw2">new</span> Timer<span class="br0">&#40;</span>_timerInterval, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_timer.<span class="me1">addEventListener</span><span class="br0">&#40;</span>TimerEvent.<span class="me1">TIMER</span>, drawRectangle<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_timer.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> <span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>_container<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TweenLite.<span class="me1">to</span><span class="br0">&#40;</span> _container, .<span class="nu0">5</span>, <span class="br0">&#123;</span> alpha:<span class="nu0">0</span>, onComplete:onContainerFadeOutComplete <span class="br0">&#125;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> onContainerFadeOutComplete<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_timer.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">_target</span>.<span class="me1">removeChild</span><span class="br0">&#40;</span>_container<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> onRectFadeOutComplete<span class="br0">&#40;</span>rect:Sprite<span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_container.<span class="me1">removeChild</span><span class="br0">&#40;</span>rect<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> drawRectangle<span class="br0">&#40;</span><span class="kw3">e</span>:TimerEvent<span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> rot:<span class="kw3">Number</span> = _count <span class="sy0">*</span> <span class="nu0">360</span> <span class="sy0">/</span> _steps;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> rect:Sprite = filledRectangle<span class="br0">&#40;</span>_rectWidth, _rectHeight, _color<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect.<span class="me1">x</span> = _radius <span class="sy0">*</span> <span class="kw3">Math</span>.<span class="kw3">cos</span><span class="br0">&#40;</span>rot <span class="sy0">*</span> <span class="kw3">Math</span>.<span class="kw3">PI</span><span class="sy0">/</span><span class="nu0">180</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect.<span class="me1">y</span> = _radius <span class="sy0">*</span> <span class="kw3">Math</span>.<span class="kw3">sin</span><span class="br0">&#40;</span>rot <span class="sy0">*</span> <span class="kw3">Math</span>.<span class="kw3">PI</span><span class="sy0">/</span><span class="nu0">180</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect.<span class="me1">rotation</span> = rot;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_container.<span class="me1">addChild</span><span class="br0">&#40;</span>rect<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_count++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TweenLite.<span class="me1">to</span><span class="br0">&#40;</span> rect, _fadeOutDuration, <span class="br0">&#123;</span> alpha:<span class="nu0">0</span>, onComplete:onRectFadeOutComplete, onCompleteParams:<span class="br0">&#91;</span>rect<span class="br0">&#93;</span> <span class="br0">&#125;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">e</span>.<span class="kw3">updateAfterEvent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>_count == _steps<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _count = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> filledRectangle<span class="br0">&#40;</span><span class="kw3">width</span>:uint, <span class="kw3">height</span>:uint, <span class="kw3">color</span>:uint<span class="br0">&#41;</span>:Sprite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> rect:Sprite = <span class="kw2">new</span> Sprite<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect.<span class="me1">graphics</span>.<span class="kw3">beginFill</span><span class="br0">&#40;</span><span class="kw3">color</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect.<span class="me1">graphics</span>.<span class="me1">drawRect</span><span class="br0">&#40;</span>-<span class="kw3">width</span><span class="sy0">/</span><span class="nu0">2</span>, -<span class="kw3">height</span><span class="sy0">/</span><span class="nu0">2</span>, <span class="kw3">width</span>, <span class="kw3">height</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rect.<span class="me1">graphics</span>.<span class="kw3">endFill</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> rect;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>The Constructor</h3>
<p>The constructor receives a list of parameters:</p>
<ul>
<li><strong>target</strong>: The display object you want to attach the preloader animation to. The type is <code>DisplayObjectContainer</code> so the target can be any object that inherits from this class (for example <code>Stage</code>, <code>MovieClip</code>, <code>Sprite</code>).</li>
<li><strong>centerX</strong>: The x position of the preloader&#8217;s center point.</li>
<li><strong>centerY</strong>: The y position of the preloader&#8217;s center point.</li>
<li><strong>radius</strong>: The radius of the preloader. Please note that this is not the outer radius of the resulting animation but the distance between the center point and the registration point of the rectangular segments.</li>
<li><strong>steps</strong>: The number of rectangles that are created in one full turn.</li>
<li><strong>rectWidth</strong>: The width of a single rectangular segment.</li>
<li><strong>rectHeight</strong>: The height of a single rectangular segment.</li>
<li><strong>color</strong>: The color of the rectangles.</li>
<li><strong>timerInterval</strong> (in ms): This parameter controls the speed of the rotation by setting the time interval after which a new rectangle is drawn.</li>
<li><strong>fadeOutInterval</strong> (in s): This parameter specifies the duration of the alpha tween that fades out it each segment.</li>
</ul>
<h3>The <em>start()</em> and <em>stop()</em> Methods</h3>
<p>These two methods are the only interface between the <em>SpinningPreloader</em> class and the outside world.</p>
<p>The <code>start()</code> method creates a container for the animation and positions it on the target display object. It also initializes the <code>_count</code> property and starts the timer which repeatedly calls the <code>drawRectangle()</code> method.</p>
<p>The <code>stop()</code> method fades out the container sprite. Once the alpha value is 0 the timer is stopped and the container is removed from the display list. If you prefer to remove the animation immediately just replace the line of code that starts the tween with the two lines from the <code>onContainerFadeOutComplete()</code> event handler method.</p>
<h3>The &#8220;Fading&#8221; Event Handlers</h3>
<p>The method <code>onContainerFadeOutComplete()</code> is called after the container&#8217;s alpha value has reached 0.</p>
<p>The method <code>onRectFadeOutComplete()</code> is called whenever a single rectangle has finished its life cycle. As soon as the rectangle&#8217;s alpha value is 0 it is removed from the display list. This way we limit the maximum number of rectangles that are child objects of the container sprite at the same time.</p>
<h3>Drawing the Rectangles</h3>
<p>The angle that defines the position of each rectangle is calculated with the help of a counter variable (<code>_count</code>) which is incremented each time a rectangle is drawn. If the counter value is equal to the number of steps <code>_count</code> is reset to zero. The result from 360 divided by the number of steps muliplied with <code>_count</code> gives us the angle in degrees. This value is stored in the local variable <code>rot</code>.</p>
<p>In order to calculate the exact x and y coordinates we need a little trigonometry.</p>
<p><img style="border: 0pt none; margin: 0px;" src="http://blog.log2e.com/wp-content/uploads/2008/05/spinning_preloader_math.gif" alt="Trigonometry " width="314" height="284" /></p>
<p>(Just on a side note, we use the three o&#8217;clock position as starting point because that&#8217;s where the 0 degree angle is situated in Flash.) The sine and cosine in the above diagram are calculated by <em>sin(A) = y/r</em> and <em>cos(A) = x/r</em>. This trigonometric relation is used in the <code>drawRectangle()</code> method:</p>
<p><code>rect.x = _radius * Math.cos(rot * Math.PI/180);</code><br />
<code>rect.y = _radius * Math.sin(rot * Math.PI/180);</code></p>
<p>Please note that the <code>Math.sin()</code> and <code>Math.cos()</code> functions expect the angle to be in radians, that&#8217;s why we have to multiply <code>rot</code> with <code>Math.PI/180</code>.</p>
<p>The rectangles themselves are created in the <code>filledRectangle()</code> method which receives the width, height and color as parameters. The sprite instance is returned to <code>drawRectangle()</code> where the x, y and rotation values are set and the rectangle is added to the display list. As soon as the rectangle is visible it starts to fade out. Invoking <code>e.updateAfterEvent()</code> causes the Flash Player to update the screen immediately after a rectangle has been added (instead of relying on the next scheduled screen update that is governed by the frame rate).</p>
<h3>Using the <em>SpinningPreloader</em> Class</h3>
<p>The animations shown on this page were created by instantiating three preloader objects with different parameters:</p>
<div class="geshi actionscript">
<ol>
<li class="li1">
<div class="de1">package</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">Sprite</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> com.<span class="kw3">log2e</span>.<span class="me1">utils</span>.<span class="me1">SpinningPreloader</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">class</span> Main <span class="kw3">extends</span> Sprite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> Main<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> pl1:SpinningPreloader = <span class="kw2">new</span> SpinningPreloader<span class="br0">&#40;</span><span class="kw3">this</span>, <span class="nu0">50</span>, <span class="nu0">70</span>, <span class="nu0">15</span>, <span class="nu0">24</span>, <span class="nu0">4</span>, <span class="nu0">2</span>, 0x0000FF, <span class="nu0">20</span>, <span class="nu0">1.5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pl1.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> pl2:SpinningPreloader = <span class="kw2">new</span> SpinningPreloader<span class="br0">&#40;</span><span class="kw3">this</span>, <span class="nu0">180</span>, <span class="nu0">70</span>, <span class="nu0">40</span>, <span class="nu0">48</span>, <span class="nu0">8</span>, <span class="nu0">3</span>, 0xFF0000, <span class="nu0">30</span>, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pl2.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> pl3:SpinningPreloader = <span class="kw2">new</span> SpinningPreloader<span class="br0">&#40;</span><span class="kw3">this</span>, <span class="nu0">330</span>, <span class="nu0">70</span>, <span class="nu0">30</span>, <span class="nu0">32</span>, <span class="nu0">12</span>, <span class="nu0">4</span>, 0&#215;999999, <span class="nu0">15</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pl3.<span class="kw3">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>Room for Improvement</h3>
<p>Where to go from here? There are several options for improving the class. For example, you could add a text field at the center of the preloader and an update function that receives the loading progress value. Or you could use a circle or a small bitmap instead of the rectangle. I will leave this as an exercise to you.</p>
<p>If you have any questions or suggestions leave a comment or drop me a message.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/05/10/spinning-preloader-in-pure-as3/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
	</channel>
</rss>

