<?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>ClickPopMedia &#187; XML</title>
	<atom:link href="http://www.clickpopmedia.com/tag/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.clickpopmedia.com</link>
	<description>ClickPopMedia is a great little design and illustration firm.</description>
	<lastBuildDate>Thu, 03 Dec 2009 17:28:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating an XML Gallery with ActionScript 3.0</title>
		<link>http://www.clickpopmedia.com/2008/05/14/creating-an-xml-gallery-with-actionscript-30/</link>
		<comments>http://www.clickpopmedia.com/2008/05/14/creating-an-xml-gallery-with-actionscript-30/#comments</comments>
		<pubDate>Thu, 15 May 2008 02:37:28 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Just for Fun!]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VQ]]></category>
		<category><![CDATA[Beginner]]></category>
		<category><![CDATA[Gallery]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=309</guid>
		<description><![CDATA[For any dynamic Flash project, XML will be a powerful tool.  One of the most common examples (and one of the simplest) is a picture gallery like the one I have here:

Images came from http://www.stockvault.net/
I will be talking about how to use Flash and XML to make a simple, yet superfly, gallery.

So, let us [...]]]></description>
			<content:encoded><![CDATA[<p>For any dynamic Flash project, XML will be a powerful tool.  One of the most common examples (and one of the simplest) is a picture gallery like the one I have here:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="700" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.clickpopmedia.com/wp-content/uploads/2008/05/xmlgallery.swf" /><embed type="application/x-shockwave-flash" width="600" height="700" src="http://www.clickpopmedia.com/wp-content/uploads/2008/05/xmlgallery.swf"></embed></object><br />
<em>Images came from <a href="http://www.stockvault.net/">http://www.stockvault.net/</a></em></p>
<p>I will be talking about how to use Flash and XML to make a simple, yet superfly, gallery.<br />
<span id="more-309"></span><br />
So, let us  start off by looking at my XML file&#8217;s structure:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc3"><span class="re1">&lt;gallery</span> <span class="re0">dir</span>=<span class="st0">&quot;//url/Photos/&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;0&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_7030_20070301.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;375&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Cute Puppy! &nbsp;Who couldn&#8217;t love that face?<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;1&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_4095_20070301.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;375&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Three Friendly Cats.<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;2&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_4281_20070301.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;375&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; The Terror of the UnderSofa!<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;3&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_6257_20070301.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;375&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Bored? Let&#8217;s play catch!<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;4&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_6882_20070301.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;377&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; It may be natural, but this picture still feels weird to me.<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;5&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_7241_20070301.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;375&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; My cats hate the snow.<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;6&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_7538_20070507.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;622&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;![CDATA[&lt;I&gt;LOOK&lt;/I&gt; IT'S &lt;B&gt;HTML&lt;/B&gt;!!!]]&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;img</span> <span class="re0">id</span>=<span class="st0">&#8216;7&#8242;</span> <span class="re0">file</span>=<span class="st0">&quot;photo_7915_20070609.jpg&quot;</span> <span class="re0">width</span>=<span class="st0">&#8216;500&#8242;</span> <span class="re0">height</span>=<span class="st0">&#8216;371&#8242;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Skinny cats are OK too.<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/img<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/gallery<span class="re2">&gt;</span></span></span></div>
<p>XML is very simple to understand if you know anything about HTML&#8217;s tag structure.  The XML document has a root <strong>tag</strong> &lt;gallery&gt; that has an <strong>attribute</strong> dir=&#8221;//url/Photos/&#8221;.  Every tag has to be closed within it&#8217;s own level of the tree.   Our gallery tag is closed at the bottom of the document with <strong>&lt;/gallery&gt;</strong>.   This means that all the  <strong>&lt;img&gt;</strong> tags are elements inside the gallery element (both open and close tags combined make up an element).</p>
<p>Our <strong>&lt;img&gt;</strong> tags have several attributes, such as the images file name and it&#8217;s pixel demensions.  Inside each <strong>&lt;img&gt;</strong> element we have a short comment about the image that will be displayed in a TextField in our Flash movie.</p>
<blockquote><p>One important thing to notice here is that if you want to have HTML in your TextField then you need to tell the code that something is a string containing HTML and not more elements.  We do this with a special bracket &lt;![CDATA[  <em>HTML GOES HERE</em> ]]&gt;  Isn&#8217;t that GREAT!  That right there probably made this whole tutorial worth while (that was a problem that took me a long time to solve).</p></blockquote>
<p>OK, now that we&#8217;ve looked at the XML we need to make it work with ActionScript 3. In Adobe Flash CS3 I created a new AS3 FLA doc and a new AS doc.  In the FLA I simply created some very basic MovieClips for my left and right arrows and I placed a TextField at the bottom of my stage (which I set to 600 X 700 with a black background).  After naming my instances and setting up the Document Class linkage I was done with the FLA side of thing and the rest is ActionScript.</p>
<p>Our Document Class has to extend MovieClip so we take our first steps thusly:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">class</span> Main <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> currentImg:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> lastImg:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">xml</span>:<span class="kw3">XML</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> loader:Loader;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> xmlLoader:URLLoader;</p>
<p>&nbsp; &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="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loader = <span class="kw2">new</span> Loader<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span class="br0">&#40;</span>loader<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xmlLoader = <span class="kw2">new</span> URLLoader<span class="br0">&#40;</span><span class="kw2">new</span> URLRequest<span class="br0">&#40;</span><span class="st0">&quot;//url/gallery.xml&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xmlLoader.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">COMPLETE</span>, <span class="kw3">parseXML</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; left_mc.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//Need to stop the arrows from flickering</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; right_mc.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>In our constructor we are initializing our Loader which will contain the loaded images and we are loading our XML document.  When the XML doc is done loading, the function parseXML will handle the content.</p>
<div class="dean_ch" style="white-space: wrap;">protected <span class="kw2">function</span> <span class="kw3">parseXML</span><span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; left_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, nextImg<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; left_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OUT</span>, arrowOut<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; left_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OVER</span>, arrowOver<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; right_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, prevImg<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; right_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OUT</span>, arrowOut<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; right_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OVER</span>, arrowOver<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">xml</span> = <span class="kw2">new</span> <span class="kw3">XML</span><span class="br0">&#40;</span>event.<span class="me1">currentTarget</span>.<span class="kw3">data</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; lastImg = <span class="kw3">xml</span>.<span class="me1">img</span>.<span class="kw3">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">1</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; currentImg = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; loadImg<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>I&#8217;ve recently gotten into the habit of using protected functions rather then private functions.  There is only one difference between the two and that&#8217;s that private <em>anything</em> won&#8217;t be inherited by child classes.<br />
In this function I set the MouseEvents for the arrows because if the XML failed to load, there would be no reason for the arrows to work.</p>
<p>Alright, so I saved my XML tree in the var <strong>xml</strong> for ease of use later.  I also saved the number of images in my XML doc using the <strong>length()</strong> method.  Something to know about the length method is it will only tell you how many elements there are of that tag type at that level.  For example, if I were to have child elements inside my <strong>img</strong> elements that would not affect the return value of <strong>xml.img.length();</strong> It&#8217;s only telling you how many img elements are children of <strong>gallery</strong> (<strong>gallery</strong> is accessed with the var <strong>xml</strong> directly).</p>
<div class="dean_ch" style="white-space: wrap;">protected <span class="kw2">function</span> loadImg<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="me1">x</span> = <span class="br0">&#40;</span><span class="kw3">stage</span>.<span class="kw3">width</span> &#8211; <span class="kw3">Number</span><span class="br0">&#40;</span><span class="kw3">xml</span>.<span class="me1">img</span><span class="br0">&#91;</span>currentImg<span class="br0">&#93;</span>.@<span class="kw3">width</span><span class="br0">&#41;</span><span class="br0">&#41;</span>/<span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="me1">y</span> = <span class="br0">&#40;</span><span class="kw3">stage</span>.<span class="kw3">height</span> &#8211; <span class="nu0">50</span> &#8211; <span class="kw3">Number</span><span class="br0">&#40;</span><span class="kw3">xml</span>.<span class="me1">img</span><span class="br0">&#91;</span>currentImg<span class="br0">&#93;</span>.@<span class="kw3">height</span><span class="br0">&#41;</span><span class="br0">&#41;</span>/<span class="nu0">2</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw2">new</span> URLRequest<span class="br0">&#40;</span><span class="kw3">xml</span>.@dir + <span class="kw3">xml</span>.<span class="me1">img</span><span class="br0">&#91;</span>currentImg<span class="br0">&#93;</span>.@file<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="me1">contentLoaderInfo</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">COMPLETE</span>, loadFin<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
protected <span class="kw2">function</span> loadFin<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; textDisp_TF.<span class="kw3">htmlText</span> = <span class="kw3">xml</span>.<span class="me1">img</span><span class="br0">&#91;</span>currentImg<span class="br0">&#93;</span>;<br />
<span class="br0">&#125;</span></div>
<p>In that first function I&#8217;m just going to focus on the one line with the URLRequest.  In order to traverse an XML tree you need start with the base.  Your XML var (in our case it&#8217;s called <strong>xml</strong>) points to that base (in this case the base is <strong>gallery</strong>).  So when we want to access the attribute <strong>dir</strong> in the tag <strong>gallery</strong>, we need to type <strong>xml.@dir</strong> and this will return <em>&#8220;//url/Photos/&#8221;</em>.  The &#8216;@&#8217; symbol denotes that it&#8217;s an attribute and not an element (tag).</p>
<p>Getting the file name is just one step further.  <strong>currentImg</strong> is a Number variable that stores which image we are on.  Thinking of our XML var as something similar to a bunch of nested arrays we can see how you might access a specific file name with <strong>xml.img[currentImg].@file</strong> This says we want the file attribute in the [currentImg] (first second so forth) img element which is in our base element.  There are quite a few ways of finding what you need in an XML doc and you can learn more about them<a href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000129.html"> here</a>.</p>
<p>In the second function we are displaying the text from within our XML img element.  Here we aren&#8217;t accessing any attributes or anything, this is where we get the content between the open &lt;img&gt; and close &lt;/img&gt; tags.</p>
<p>Finally we have the arrow MouseEvent handlers:</p>
<div class="dean_ch" style="white-space: wrap;">protected <span class="kw2">function</span> arrowOut<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">MovieClip</span><span class="br0">&#40;</span>event.<span class="me1">currentTarget</span><span class="br0">&#41;</span>.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>protected <span class="kw2">function</span> arrowOver<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">MovieClip</span><span class="br0">&#40;</span>event.<span class="me1">currentTarget</span><span class="br0">&#41;</span>.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>protected <span class="kw2">function</span> nextImg<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="me1">unload</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; currentImg = <span class="br0">&#40;</span>currentImg &lt; lastImg<span class="br0">&#41;</span>? currentImg + <span class="nu0">1</span> : <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; loadImg<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>protected <span class="kw2">function</span> prevImg<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; loader.<span class="me1">unload</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; currentImg = <span class="br0">&#40;</span>currentImg &gt; <span class="nu0">0</span><span class="br0">&#41;</span>? currentImg &#8211; <span class="nu0">1</span> : lastImg;<br />
&nbsp; &nbsp; &nbsp; &nbsp; loadImg<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Once again I&#8217;m using the less obvious form of the if..else statement.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">if</span><span class="br0">&#40;</span>num&gt;<span class="nu0">5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; num = <span class="nu0">5</span>;<br />
<span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; num = <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span><br />
<span class="co1">//OR, THIS NEXT PART DOES THE SAME THING</span><br />
num = <span class="br0">&#40;</span>num&gt;<span class="nu0">5</span><span class="br0">&#41;</span>? <span class="nu0">5</span> : <span class="nu0">0</span>;</div>
<p>Well that&#8217;s about it for this level of a gallery.  You can make galleries look really nice with fade transitions between images, small loading animations for larger images, scrollable thumbnail selection menu&#8230;  etc.</p>
<p>Here is a downloadable source of my example file (images not included&#8230; get them <a href="http://www.stockvault.net/">here</a>): <a href="http://www.clickpopmedia.com/wp-content/uploads/2008/05/xmlgallery.zip">XMLGallery.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/05/14/creating-an-xml-gallery-with-actionscript-30/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Making an MP3 player in AS3</title>
		<link>http://www.clickpopmedia.com/2008/04/15/making-an-mp3-player-in-as3/</link>
		<comments>http://www.clickpopmedia.com/2008/04/15/making-an-mp3-player-in-as3/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 00:12:24 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Paul]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Intermediate]]></category>
		<category><![CDATA[MP3 Player]]></category>
		<category><![CDATA[Sound]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.clickpopmedia.com/?p=250</guid>
		<description><![CDATA[
Music Credits:
Title: The Best Day Ever
Artist: SpongBob
Album: The SpongeBob SquarePants Movie: Music From the Movie and More
Creating an MP3 Player in ActionScript 3.0 is fairly straight forward. The complexity varies greatly depending on what kind of features you want your player to have.  I don&#8217;t plan on getting into ID3 tags here, but otherwise [...]]]></description>
			<content:encoded><![CDATA[<p><center><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="288" height="170" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.clickpopmedia.com/wp-content/uploads/2008/04/as3mp3player.swf" /><embed type="application/x-shockwave-flash" width="288" height="170" src="http://www.clickpopmedia.com/wp-content/uploads/2008/04/as3mp3player.swf"></embed></object></center><br />
<em>Music Credits:<br />
Title: The Best Day Ever<br />
Artist: SpongBob<br />
Album: The SpongeBob SquarePants Movie: Music From the Movie and More</em></p>
<p>Creating an MP3 Player in ActionScript 3.0 is fairly straight forward. The complexity varies greatly depending on what kind of features you want your player to have.  I don&#8217;t plan on getting into ID3 tags here, but otherwise (as you can see) I will be going over the full functionality of a normal MP3 Player.<br />
<span id="more-250"></span><br />
The first step is setting up the display and graphics.  I went into the FLVPlayback skin SkinOverAll.fla file and fetched all the button graphics I needed (I&#8217;m not a very good artist).  It was only a little trouble to recreate the buttons in a way that satisfied me (<i>The only important thing to note about my buttons is that I gave them frame labels on the keyframes to make it easier to remember while writing the code</i>).</p>
<h3>Setting up the framework:</h3>
<p>Now for the code!  You can approach code like this from a number of different directions.  I chose to start with making my button instances look like buttons, even though they don&#8217;t do anything yet.  It&#8217;s really just a matter of setting up a LOT of event listeners (4 for each button):</p>
<div class="dean_ch" style="white-space: wrap;">&#8230;<br />
<span class="me1">stop_mc</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OVER</span>, StopOver<span class="br0">&#41;</span>;<br />
stop_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OUT</span>, StopOut<span class="br0">&#41;</span>;<br />
stop_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, StopDown<span class="br0">&#41;</span>;<br />
stop_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, StopUp<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> StopOver<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_over&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> StopOut<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> StopDown<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_down&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="kw3">private</span> <span class="kw2">function</span> StopUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="me1">playing</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;play&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_over&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&#8230;</div>
<p>At this point most of the buttons are the same.  The only difference might lay in the MOUSE_UP event or how the play button has to switch between play and pause, so I have the boolean property playing in my PlayPauseBtn class.</p>
<h3>Bringing in a PlayList:</h3>
<p>Now that we have basic working buttons that don&#8217;t do anything, it feels like the framework is in place to start making our MP3 player play music.  To do this we will need a few elements:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">url</span>:URLRequest;<br />
<span class="kw3">public</span> <span class="kw2">var</span> xmlLoad:URLLoader;<br />
<span class="kw3">public</span> <span class="kw2">var</span> musicXML:<span class="kw3">XML</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> song:<span class="kw3">Sound</span>;<br />
<span class="kw3">public</span> <span class="kw2">var</span> channel:SoundChannel;<br />
<span class="kw3">public</span> <span class="kw2">var</span> sndTrans:SoundTransform;<br />
<span class="kw3">public</span> <span class="kw2">var</span> <span class="kw3">position</span>:<span class="kw3">Number</span>;</div>
<p>Our <b>song:Sound</b> will load the song and play it.  The <b>play()</b> method in the Sound class returns a sound channel which we need to store in our channel:SoundChannel in order to pause/play/stop, or change the volume of our music.  </p>
<p>The <b>SoundTransform</b> class is what is used to change the volume through the channel.  It can also change the pan (balance of left and right speakers), but I&#8217;m not going to get into that.</p>
<p>What we are going to do is load an external XML file with our playlist in it&#8230;  something like this:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="sc3"><span class="re1">&lt;music<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/TheBestDayEver.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;The Best Day Ever&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/come_away.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Come Away&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/nightmares.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Nightmares and Dreams&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/override.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Override&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/rescue.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Rescue&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/stick_em_up.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;Stick&#8217;em Up&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/trogdor.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;TROGDOOOR&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;song</span> <span class="re0">id</span>=<span class="st0">&quot;/url/you_are.mp3&quot;</span> <span class="re0">disp</span>=<span class="st0">&quot;You Are&quot;</span><span class="re2">/&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/music<span class="re2">&gt;</span></span></span></div>
<p>Then we want to add each song on that playlist to a list component on the stage (I&#8217;ve called it <b>playList</b>).  After we have the URLs of our songs, then we can start to load and play them.</p>
<p>In our <b>xmlComplete(event:Event)</b> event handler (handling the COMPLETE event from loading our XML file with a URLLoader) we need to parse the playlist into our List:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> xmlComplete<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> item:<span class="kw3">Object</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; musicXML = <span class="kw2">new</span> <span class="kw3">XML</span><span class="br0">&#40;</span>event.<span class="me1">currentTarget</span>.<span class="kw3">data</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> each<span class="br0">&#40;</span><span class="kw2">var</span> prop:<span class="kw3">XML</span> <span class="kw1">in</span> musicXML.<span class="me1">song</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item = <span class="kw2">new</span> <span class="kw3">Object</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="me1">label</span> = prop.@disp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.<span class="kw3">data</span> = prop.@id;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">addItem</span><span class="br0">&#40;</span>item<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; song = <span class="kw2">new</span> <span class="kw3">Sound</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="me1">addEventListener</span><span class="br0">&#40;</span>IOErrorEvent.<span class="me1">IO_ERROR</span>, ioErrorHandler<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw2">new</span> URLRequest<span class="br0">&#40;</span>playList.<span class="me1">getItemAt</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>.<span class="kw3">data</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, updateSeek<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span> = <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span></div>
<p>The <b>for each..in loop</b> is one that not everyone knows about.  It&#8217;s very useful for getting all the elements of an XML object when you aren&#8217;t sure how many elements there will be.  Basically it&#8217;s assigning each song tag from the <b>XMLList musicXML.song</b> to prop and then runs the code within the curly brackets {}.</p>
<p>I don&#8217;t like it when music or sounds start playing on the internet without my consent.  So, whenever I make something like and MP3 Player, I set it up to NOT automatically play.</p>
<p>Still, I want it to be ready to play as soon as the user tells it to.  So, I needed to add those lines after my <b>for each..in loop</b>.  What is happening might be obvious enough.  I&#8217;m creating a new Sound object and storing it in song.  I always check for load errors so that the end user doesn&#8217;t get annoying pop-ups telling them that I&#8217;m a bad programmer.  Then I&#8217;m loading the first song on the playList and making that song highlighted in my List component.</p>
<p>The event listener with a handle of <b>updateSeek</b> is needed for my seekbar. I will get to that later.</p>
<h3>Playing the music and traversing out PlayList:</h3>
<p>Great!  So, now we have everything set up to look like a complete player.  We even have our first song loaded.  But, there is no way to get it to play yet.  Our PLAY button doesn&#8217;t work yet.</p>
<p>This is where we have to start giving those buttons some functionality.  Most (if not all) of the functionality for each button is going to be in the MOUSE_UP event handlers:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> PlayUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>obj.<span class="me1">playing</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;play_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = channel.<span class="kw3">position</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">playing</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;pause_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel = song.<span class="kw3">play</span><span class="br0">&#40;</span><span class="kw3">position</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">SOUND_COMPLETE</span>, soundComplete<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">playing</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> StopUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="me1">playing</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;play&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8217;stop_over&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="me1">playList</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>ListEvent.<span class="me1">ITEM_CLICK</span>, SnglClick<span class="br0">&#41;</span>;</p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> SnglClick<span class="br0">&#40;</span>event:ListEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> item:<span class="kw3">Object</span> = event.<span class="me1">item</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">try</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>song.<span class="kw3">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">catch</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="kw3">trace</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">try</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">catch</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="kw3">trace</span><span class="br0">&#40;</span><span class="kw3">error</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; song = <span class="kw2">new</span> <span class="kw3">Sound</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="me1">addEventListener</span><span class="br0">&#40;</span>IOErrorEvent.<span class="me1">IO_ERROR</span>, ioErrorHandler<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; song.<span class="kw3">load</span><span class="br0">&#40;</span><span class="kw2">new</span> URLRequest<span class="br0">&#40;</span>item.<span class="kw3">data</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel = song.<span class="kw3">play</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">SOUND_COMPLETE</span>, soundComplete<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="me1">playing</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; playPause_mc.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;pause&#8217;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> soundComplete<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playList.<span class="kw3">length</span> &gt; playList.<span class="me1">selectedIndex</span> + <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span>++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> ListEvent<span class="br0">&#40;</span>ListEvent.<span class="me1">ITEM_CLICK</span>, <span class="kw2">false</span>, <span class="kw2">true</span>, <span class="nu0">0</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedItem</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>&#8230;</p>
<p><span class="kw3">private</span> <span class="kw2">function</span> ForwardUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;forward_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playList.<span class="kw3">length</span> &gt; playList.<span class="me1">selectedIndex</span> + <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span>++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">selectedIndex</span> = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">scrollToSelected</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; playList.<span class="me1">dispatchEvent</span><span class="br0">&#40;</span><span class="kw2">new</span> ListEvent<span class="br0">&#40;</span>ListEvent.<span class="me1">ITEM_CLICK</span>, <span class="kw2">false</span>, <span class="kw2">true</span>, <span class="nu0">0</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedIndex</span>, playList.<span class="me1">selectedItem</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>My Play/Pause button, if playing, will save the current position and then stop the music through the channel.  Otherwise, it will play from position and set the volume and add a listener for the end of the song.</p>
<p>The Stop button obviously just stops the song and sets the position back to zero (0). I guess it also resets the Play button.</p>
<p>The  <b>ListEvent.ITEM_CLICK</b> is when we click on a list item (a new song in the playlist).  The handler closes any open stream that might be there (thus the <b>try..catch</b>) and if not then to simply stop the channel.  It then loads the song URL stored in that items data provider and starts it playing.</p>
<p>The forward and back buttons are almost exactly the same.  They just change the selection in the List component and then dispatch a fake <b>ITEM_CLICK</b> event.</p>
<p>The <b>soundComplete()</b> method, as you can see, is also very similar to the forward button.  This event handler is called when a song played right to the end.</p>
<h3>Working with volume:</h3>
<p>Since I&#8217;ve already mentioned setting the volume, I might as well get into that next.  The volume is a property of the <b>SoundTransform class</b>.  We already made a <b>SoundTransform</b> variable, we just haven&#8217;t stored an ST object in it yet.</p>
<p>My main volume control is <b>sndTrans:SoundTransform;</b>  After setting the volume property within it I can assign it to the <b>channel.soundTransform</b> and it will take effect.  My volume bar has it&#8217;s own class to handle the effect of dragging the handle around:</p>
<div class="dean_ch" style="white-space: wrap;">package controls <span class="br0">&#123;</span><br />
<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="kw3">MovieClip</span>;<br />
<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">*</span>;<br />
<span class="kw3">import</span> flash.<span class="me1">geom</span>.<span class="me1">Rectangle</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="kw3">public</span> <span class="kw2">class</span> VolControl <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> bounds:Rectangle;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> percent:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> VolControl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = <span class="nu0">1</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bounds = <span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">10</span>, <span class="nu0">50</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volBar_mc.<span class="me1">hit_mc</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, endDrag<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_OUT</span>, endDrag<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> dragHandle<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="kw3">startDrag</span><span class="br0">&#40;</span><span class="kw2">true</span>, bounds<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, changeVol<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> endDrag<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volHandle_mc.<span class="kw3">stopDrag</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="me1">x</span> = volHandle_mc.<span class="me1">x</span> &#8211; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = volHandle_mc.<span class="me1">x</span>/<span class="nu0">50</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span><span class="st0">&quot;volume_change&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">this</span>.<span class="me1">removeEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">ENTER_FRAME</span>, changeVol<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> changeVol<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="me1">x</span> = volHandle_mc.<span class="me1">x</span> &#8211; volBar_mc.<span class="me1">fullness_mc</span>.<span class="me1">fill_mc</span>.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = volHandle_mc.<span class="me1">x</span>/<span class="nu0">50</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span><span class="st0">&quot;volume_change&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>This is simply letting you drag around the little pointer within its bounds and dispatching an event to let the main class know that the volume has been changed.  I needed to repeat some of the code from <b>changeVol()</b> in <b>endDrag()</b> because if you just click quickly then the ENTER_FRAME event never gets handled before it&#8217;s removed.</p>
<p>Back in the main class we are handling that “<b>volume_change</b>” event:</p>
<div class="dean_ch" style="white-space: wrap;">vol_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;volume_change&quot;</span>, updateVolume<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> updateVolume<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sndTrans.<span class="me1">volume</span> = vol_mc.<span class="me1">percent</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
<span class="br0">&#125;</span></div>
<p>Another thing that a lot of new programmers don&#8217;t know about is the conditional ? : operator.  It&#8217;s shorthand for an if..else statement.  Basically these two bits of code are the same:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">if</span><span class="br0">&#40;</span>num&gt;<span class="nu0">5</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; num = <span class="nu0">5</span>;<br />
<span class="br0">&#125;</span><span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; num = <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span><br />
<span class="co1">//OR THIS NEXT PART DOES THE SAME THING</span><br />
num = <span class="br0">&#40;</span>num&gt;<span class="nu0">5</span><span class="br0">&#41;</span>? <span class="nu0">5</span> : <span class="nu0">0</span>;</div>
<p>Isn&#8217;t that great?</p>
<p>Getting back to our MP3 player.  We should add our Mute button while we are working with volume.  You&#8217;ve already seen that I take the mute condition into account when I set that volume.  Here is where I set the mute condition:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">private</span> <span class="kw2">function</span> MuteUp<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> obj:<span class="kw3">Object</span> = event.<span class="me1">currentTarget</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>obj.<span class="me1">isMute</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;mute_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">isMute</span> = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="kw3">gotoAndStop</span><span class="br0">&#40;</span><span class="st0">&#8216;unmute_over&#8217;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.<span class="me1">isMute</span> = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>I never want to set <b>sndTrans.volume</b> to zero (0) just because I pressed the mute button.  I would rather leave that as it is so that I can unmute back to the original volume again.</p>
<p>*phew* About this time I&#8217;m thinking to myself, “It sure takes a lot of code to get a simple MP3 Player to work correctly.”  But, there is light on the horizon so we must press on.</p>
<h3>Making the seek bar to search a song:</h3>
<p>Now for the most complicated part of our player.  The seek bar.  The seek bar isn&#8217;t THAT bad, but it&#8217;s definitely worse then what we have done so far.</p>
<p>First of all we will give the seek bar the same drag or click functionality that we gave to volume control bar:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">public</span> <span class="kw2">class</span> SeekControl <span class="kw3">extends</span> <span class="kw3">MovieClip</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">var</span> bounds:Rectangle;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> percent:<span class="kw3">Number</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">var</span> seeking:<span class="kw3">Boolean</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> SeekControl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seeking = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bounds = <span class="kw2">new</span> Rectangle<span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">12</span>, <span class="nu0">100</span>, <span class="nu0">0</span><span class="br0">&#41;</span>; <span class="co1">//I made the seek bar 100 wide for convenience</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHit_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_DOWN</span>, dragHandle<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span>MouseEvent.<span class="me1">MOUSE_UP</span>, endDrag<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> dragHandle<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seeking = <span class="kw2">true</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="kw3">startDrag</span><span class="br0">&#40;</span><span class="kw2">true</span>, bounds<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> endDrag<span class="br0">&#40;</span>event:MouseEvent<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seeking = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="kw3">stopDrag</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fillBar_mc.<span class="me1">x</span> = seekHandle_mc.<span class="me1">x</span> &#8211; fillBar_mc.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; percent = seekHandle_mc.<span class="me1">x</span>/<span class="nu0">100</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dispatchEvent<span class="br0">&#40;</span><span class="kw2">new</span> Event<span class="br0">&#40;</span><span class="st0">&quot;seek_change&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> moveSeekPos<span class="br0">&#40;</span>perc:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fillBar_mc.<span class="me1">x</span> = <span class="br0">&#40;</span>fillBar_mc.<span class="kw3">width</span> * perc<span class="br0">&#41;</span> &#8211; fillBar_mc.<span class="kw3">width</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>!seeking<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seekHandle_mc.<span class="me1">x</span> = <span class="nu0">100</span> * perc;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>The biggest difference here is that I don&#8217;t want a live update while dragging the pointer around.  Otherwise, a few values have changed, some var names have changed, but it should look familiar (well it would if you had written this code yourself).</p>
<p>The <b>moveSeekPos()</b> method is going to be updated constantly from our main class.  This is here so that we can see the play progress when listening to a song.</p>
<p>Getting back to the main class again, we have to write a thing or two about our seek bar there:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="coMULTI">/*Remember that <br />
this.addEventListener(Event.ENTER_FRAME, updateSeek);<br />
is added when we start to load a new song.*/</span><br />
seek_mc.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;seek_change&quot;</span>, changeSeekBar<span class="br0">&#41;</span>;<br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> changeSeekBar<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">position</span> = song.<span class="kw3">length</span> * seek_mc.<span class="me1">percent</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playPause_mc.<span class="me1">playing</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="kw3">stop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel = song.<span class="kw3">play</span><span class="br0">&#40;</span><span class="kw3">position</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">soundTransform</span> = <span class="br0">&#40;</span>mute_mc.<span class="me1">isMute</span><span class="br0">&#41;</span>? <span class="kw2">new</span> SoundTransform<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span> : sndTrans;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; channel.<span class="me1">addEventListener</span><span class="br0">&#40;</span>Event.<span class="me1">SOUND_COMPLETE</span>, soundComplete<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&#8230;<br />
<span class="kw3">private</span> <span class="kw2">function</span> updateSeek<span class="br0">&#40;</span>event:Event<span class="br0">&#41;</span>:<span class="kw3">void</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>playPause_mc.<span class="me1">playing</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> perc:<span class="kw3">Number</span> = channel.<span class="kw3">position</span> / song.<span class="kw3">length</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seek_mc.<span class="me1">moveSeekPos</span><span class="br0">&#40;</span>perc<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display_mc.<span class="me1">timeDisp</span>.<span class="kw3">text</span> = formatTime<span class="br0">&#40;</span>channel.<span class="kw3">position</span><span class="br0">&#41;</span> + <span class="st0">&quot;/&quot;</span> + formatTime<span class="br0">&#40;</span>song.<span class="kw3">length</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&#8230;<br />
<span class="kw3">public</span> <span class="kw2">function</span> formatTime<span class="br0">&#40;</span><span class="kw3">time</span>:<span class="kw3">Number</span><span class="br0">&#41;</span>:<span class="kw3">String</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> <span class="kw3">min</span>:<span class="kw3">String</span> = <span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">60000</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> sec:<span class="kw3">String</span> = <span class="br0">&#40;</span><span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>%<span class="nu0">60</span><span class="br0">&#41;</span> &lt; <span class="nu0">10</span><span class="br0">&#41;</span>? <span class="st0">&quot;0&quot;</span> + <span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>%<span class="nu0">60</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> : <span class="kw3">Math</span>.<span class="kw3">floor</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">time</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>%<span class="nu0">60</span><span class="br0">&#41;</span>.<span class="kw3">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="br0">&#40;</span><span class="kw3">min</span>+<span class="st0">&quot;:&quot;</span>+sec<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>I went ahead and added the code here to display the current play time and the total play time in a dynamic text field on the stage.  That seemed to be closely related to the seek bar, so I figured showing it here is suitable.</p>
<h3>A final note:</h3>
<p>Now would be a good time to mention that I didn&#8217;t bother fixing a “minor” bug.  While a song is still streaming (loading), Flash doesn&#8217;t know how long it is.  Thus, <b>song.length</b> will be growing over time till it&#8217;s done loading.  This is only an issue for our seek bar, because it uses the ratio between the current position and the total length to decide how to display itself.</p>
<p>To work around this issue (which is really only an issue for slower internet connections), you will need to pass Flash the songs length along with the file path in the XML doc.  It seemed like a lot of trouble to me and since this isn&#8217;t for a client, I figured I would just tell you about it instead of do it for you.</p>
<p>Wow.  This was so long that I wouldn&#8217;t be surprised to find later that I forgot something.  If I find anything I will make sure to update this post and make a note of what I changed.</p>
<p>Anyways, that is it! I think&#8230;   </p>
<p>Let me know what you think about it and also let me know if you even use my Player on your site somewhere.  I would love to see my work being used.</p>
<p>You can get the source files for this tutorial and the example at the beginning to the page here: <a href='http://www.clickpopmedia.com/wp-content/uploads/2008/07/mp3-player-source-code.rar'>MP3 Player Source Code.rar</a></p>
<p><em><strong>UPDATE:</strong> I have updated the source file to include changes which will fix a few bugs pointed out to me over time.  I also added a few new lines to the disclaimer at the beginning of my code which explains that WE DO NOT PROVIDE TECHNICAL SUPPORT FOR OUR EXAMPLE CODE.  It is there for reference only.  We would hope that you would use our code in conjunction with the tutorial to learn how to do it yourself.<br />
We understand that most people will just download and use the code without much effort towards learn new skills, but we aren&#8217;t going to answer your questions in that case. If you notice something wrong with the code and want to bring it to our attention that would be appreciated, but any questions on how to use the code will be answered with &#8220;Read the tutorial.&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.clickpopmedia.com/2008/04/15/making-an-mp3-player-in-as3/feed/</wfw:commentRss>
		<slash:comments>115</slash:comments>
		</item>
	</channel>
</rss>

