<?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>pixology &#187; actionscript 2.0</title>
	<atom:link href="http://www.pixologyinteractive.com/tag/actionscript-20/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pixologyinteractive.com</link>
	<description>//creativity from the ground up</description>
	<lastBuildDate>Wed, 23 Sep 2009 16:56:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Adding a Scrollbar to a Dynamicly Populated Menu List in ActionScript 2.0</title>
		<link>http://www.pixologyinteractive.com/2009/06/adding-a-scrollbar-to-a-dynamicly-populated-menu-list-in-actionscript-2/</link>
		<comments>http://www.pixologyinteractive.com/2009/06/adding-a-scrollbar-to-a-dynamicly-populated-menu-list-in-actionscript-2/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 18:05:20 +0000</pubDate>
		<dc:creator>Erin Pierce</dc:creator>
				<category><![CDATA[develop]]></category>
		<category><![CDATA[interact]]></category>
		<category><![CDATA[teaching]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 2.0]]></category>
		<category><![CDATA[dynamic menu]]></category>

		<guid isPermaLink="false">http://www.erinpierce.com/?p=234</guid>
		<description><![CDATA[Hello people. Yesterday I made a break through. I had been struggling for a few days, attempting to think through how on earth I was going to add a custom scrollbar to TWO dynamically populated menu lists. Well, I solved it. First I found the code I needed and a sample file on kirupa.com (they [...]]]></description>
			<content:encoded><![CDATA[<p>Hello people. Yesterday I made a break through. I had been struggling for a few days, attempting to think through how on earth I was going to add a custom scrollbar to TWO dynamically populated menu lists. Well, I solved it. First I found the code I needed and a sample file on <a href="http://www.kirupa.com/developer/flash8/scrollbar.htm" target="_blank">kirupa.com</a> (they rock btw).</p>
<p>Before the scrolling, I had an XML document with categories and projects. My code loaded the XML, parsed it and duplicated my menu item (nav button) using the <span class="Unicode">duplicateMovieClip()</span> method. I had it nested in a <span class="Unicode">for</span> loop and so it did all of the naming and depth placement at once. When you clicked on a menu item, a second function was called to populate the second list, passing through the category number and using the same <span class="Unicode">duplicateMovieClip()</span> method.</p>
<p>After looking at the way <a href="http://www.kirupa.com/" target="_blank">kirupa.com</a> set up the scrollbar file I realized I needed to put both of my menu lists into container movie clips. That way I would be able to get the <span class="Unicode">_y</span> and <span class="Unicode">_height</span> properties of the grouped nav buttons. I&#8217;ve been working a lot with AS 3.0 and needed a refresher in AS 2 on how to nest duplicated items inside a movie clip. I Googled and found <a href="http://www.actionscript.org/forums/showthread.php3?t=61711" target="_blank">this article on actionscript.org</a> reminding me you must use the <span class="Unicode">attachMovie()</span> method.</p>
<p>First I put both nav buttons into their own movie clips and call them: listOneHolder and listTwoHolder. Then I changed both <span class="Unicode">duplicateMovieClip()</span> methods to <span class="Unicode">attachMovie()</span>. Now the code looked like this:</p>
<blockquote><p><span class="Unicode">function loadXML(loaded)</span><br />
<span class="Unicode">{</span><br />
<span class="Unicode"> if (loaded)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> xml = this.firstChild;</span><br />
<span class="Unicode"> totalSections = xml.childNodes.length;</span><br />
<span class="Unicode"> for (i = 0; i &lt; totalSections; i++)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> //duplicateMovieClip(myNav, &#8216;myNav&#8217;+i, i + 10); //OLD duplicate nav buttons</span><br />
<span class="Unicode"> _root.listOneHolder.attachMovie(&#8216;myNav&#8217;, &#8216;myNav&#8217; + i, i + 10); //new attach movies</span></p>
<p><span class="Unicode"> setProperty(_root.listOneHolder['myNav'+i], _x, navX); //set the x property</span><br />
<span class="Unicode"> setProperty(_root.listOneHolder['myNav'+i], _y, navY); //set the y property</span></p>
<p><span class="Unicode"> _root.listOneHolder['myNav'+i].navTxt.htmlText = xml.childNodes[i].attributes.name; // set the text value</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode">}</span></p></blockquote>
<p>note: in addition to having my two menu item movie clips on the stage (myNav and btn), i made sure to right click on them in the library, select &#8220;Linkage&#8230;&#8221; and clicked &#8220;Export for ActionScript&#8221;.</p>
<p>after that i was able to start tackling the actual scrollbar issue. i figured out that i could use the code from <a href="http://www.kirupa.com/developer/flash8/scrollbar.htm" target="_blank">kirupa.com</a> (as seen below) and modify it to accommodate for my two lists.</p>
<blockquote><p><span class="Unicode">// KIRUPA //</span><br />
<span class="Unicode">function scrolling () {</span><br />
<span class="Unicode"> var scrollHeight:Number = theScrollbar.scrollTrack._height;</span><br />
<span class="Unicode"> var contentHeight:Number = contentMain._height;</span><br />
<span class="Unicode"> var scrollFaceHeight:Number = theScrollbar.scrollFace._height;</span><br />
<span class="Unicode"> var maskHeight:Number = maskedView._height;</span><br />
<span class="Unicode"> var initPosition:Number = theScrollbar.scrollFace._y=theScrollbar.scrollTrack._y;</span><br />
<span class="Unicode"> var initContentPos:Number = contentMain._y;</span><br />
<span class="Unicode"> var finalContentPos:Number = maskHeight-contentHeight+initContentPos;</span><br />
<span class="Unicode"> var left:Number = theScrollbar.scrollTrack._x;</span><br />
<span class="Unicode"> var top:Number = theScrollbar.scrollTrack._y;</span><br />
<span class="Unicode"> var right:Number = theScrollbar.scrollTrack._x;</span><br />
<span class="Unicode"> var bottom:Number = theScrollbar.scrollTrack._height-scrollFaceHeight+theScrollbar.scrollTrack._y;</span><br />
<span class="Unicode"> var dy:Number = 0;</span><br />
<span class="Unicode"> var speed:Number = 10;</span><br />
<span class="Unicode"> var moveVal:Number = (contentHeight-maskHeight)/(scrollHeight-scrollFaceHeight);</span><br />
<span class="Unicode"> </span><br />
<span class="Unicode"> theScrollbar.scrollFace.onPress = function() {</span><br />
<span class="Unicode"> var currPos:Number = this._y;</span><br />
<span class="Unicode"> startDrag(this, false, left, top, right, bottom);</span><br />
<span class="Unicode"> this.onMouseMove = function() {</span><br />
<span class="Unicode"> dy = Math.abs(initPosition-this._y);</span><br />
<span class="Unicode"> contentMain._y = Math.round(dy*-1*moveVal+initContentPos);</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.scrollFace.onMouseUp = function() {</span><br />
<span class="Unicode"> stopDrag();</span><br />
<span class="Unicode"> delete this.onMouseMove;</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.btnUp.onPress = function() {</span><br />
<span class="Unicode"> this.onEnterFrame = function() {</span><br />
<span class="Unicode"> if (contentMain._y+speed</span><br />
<span class="Unicode"> if (theScrollbar.scrollFace._y&lt;=top) {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._y = top;</span><br />
<span class="Unicode"> } else {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._y -= speed/moveVal;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> contentMain._y += speed;</span><br />
<span class="Unicode"> } else {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._y = top;</span><br />
<span class="Unicode"> contentMain._y = maskedView._y;</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.btnUp.onDragOut = function() {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.btnUp.onRelease = function() {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.btnDown.onPress = function() {</span><br />
<span class="Unicode"> this.onEnterFrame = function() {</span><br />
<span class="Unicode"> if (contentMain._y-speed&gt;finalContentPos) {</span><br />
<span class="Unicode"> if (theScrollbar.scrollFace._y&gt;=bottom) {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._y = bottom;</span><br />
<span class="Unicode"> } else {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._y += speed/moveVal;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> contentMain._y -= speed;</span><br />
<span class="Unicode"> } else {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._y = bottom;</span><br />
<span class="Unicode"> contentMain._y = finalContentPos;</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.btnDown.onRelease = function() {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> theScrollbar.btnDown.onDragOut = function() {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> };</span><br />
<span class="Unicode"> </span><br />
<span class="Unicode"> if (contentHeight</span><br />
<span class="Unicode"> theScrollbar.scrollFace._visible = false;</span><br />
<span class="Unicode"> theScrollbar.btnUp.enabled = false;</span><br />
<span class="Unicode"> theScrollbar.btnDown.enabled = false;</span><br />
<span class="Unicode"> } else {</span><br />
<span class="Unicode"> theScrollbar.scrollFace._visible = true;</span><br />
<span class="Unicode"> theScrollbar.btnUp.enabled = true;</span><br />
<span class="Unicode"> theScrollbar.btnDown.enabled = true;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode">};</span></p></blockquote>
<p>In order to accommodate for my two lists I needed to modify the function to have a few parameters passed through &#8230; those were the scrollbar instance (i put two on my stage, one for each list), the mask instance (again, two on each stage, one for each list), and the list. So my new function looked like this:</p>
<blockquote><p><span class="Unicode">function goScrolling (_mc, mask_mc, listHolder_mc)</span><br />
<span class="Unicode">{</span><br />
<span class="Unicode"> var scrollHeight:Number = _mc.scrollTrack._height;</span><br />
<span class="Unicode"> var contentHeight:Number = listHolder_mc._height;</span><br />
<span class="Unicode"> var scrollFaceHeight:Number = _mc.scrollFace._height;</span><br />
<span class="Unicode"> var maskHeight:Number = mask_mc._height;</span><br />
<span class="Unicode"> var initPosition:Number = _mc.scrollFace._y = _mc.scrollTrack._y;</span><br />
<span class="Unicode"> var initContentPos:Number = listHolder_mc._y;</span><br />
<span class="Unicode"> var finalContentPos:Number = maskHeight &#8211; contentHeight + initContentPos;</span><br />
<span class="Unicode"> var left:Number = _mc.scrollTrack._x;</span><br />
<span class="Unicode"> var top:Number = _mc.scrollTrack._y;</span><br />
<span class="Unicode"> var right:Number = _mc.scrollTrack._x;</span><br />
<span class="Unicode"> var bottom:Number = _mc.scrollTrack._height &#8211; scrollFaceHeight + _mc.scrollTrack._y;</span><br />
<span class="Unicode"> var dy:Number = 0;</span><br />
<span class="Unicode"> var speed:Number = 10;</span><br />
<span class="Unicode"> var moveVal:Number = (contentHeight &#8211; maskHeight) / (scrollHeight-scrollFaceHeight);</span><br />
<span class="Unicode"> </span><br />
<span class="Unicode"> _mc.scrollFace.onPress = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> var currPos:Number = this._y;</span><br />
<span class="Unicode"> startDrag(this, false, left, top, right, bottom);</span><br />
<span class="Unicode"> this.onMouseMove = function() </span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> dy = Math.abs(initPosition &#8211; this._y);</span><br />
<span class="Unicode"> listHolder_mc._y = Math.round(((dy * -1) * moveVal) + initContentPos);</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.scrollFace.onMouseUp = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> stopDrag();</span><br />
<span class="Unicode"> delete this.onMouseMove;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.btnUp.onPress = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> this.onEnterFrame = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> if (listHolder_mc._y + speed &lt; mask_mc._y)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> if (_mc.scrollFace._y &lt;= top)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc.scrollFace._y = top;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> else</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc.scrollFace._y -= speed / moveVal;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> listHolder_mc._y += speed;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> else</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc.scrollFace._y = top;</span><br />
<span class="Unicode"> listHolder_mc._y = mask_mc._y;</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.btnUp.onDragOut = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.btnUp.onRelease = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.btnDown.onPress = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> this.onEnterFrame = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> if ((listHolder_mc._y &#8211; speed) &gt; finalContentPos)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> if (_mc.scrollFace._y &gt;= bottom)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc.scrollFace._y = bottom;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> else</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc.scrollFace._y += speed / moveVal;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> listHolder_mc._y -= speed;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> else</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc.scrollFace._y = bottom;</span><br />
<span class="Unicode"> listHolder_mc._y = finalContentPos;</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.btnDown.onRelease = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> _mc.btnDown.onDragOut = function()</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> delete this.onEnterFrame;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> </span><br />
<span class="Unicode"> if (contentHeight &lt; maskHeight)</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc._visible = false;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode"> else</span><br />
<span class="Unicode"> {</span><br />
<span class="Unicode"> _mc._visible = true;</span><br />
<span class="Unicode"> }</span><br />
<span class="Unicode">}</span></p></blockquote>
<p>Once I had that modified, I needed to figure out when to call the function. First I called it right away. The first menu populates and at the end of my XML loader function I call the scrolling function to check to see if either list needs a scrollbar. Then, once one of the categories is selected (from list one), I needed to call the scrolling function again, checking to see if list two needs a scrollbar.</p>
<p>So, the first time I call it, inside my XML loader function, I am passing through the scrollbar for list one, the mask for list one and list one mc:</p>
<blockquote><p><span class="Unicode">goScrolling(_root.theScrollbar1, _root.maskedView1, _root.listOneHolder);</span></p></blockquote>
<p>The second time I call the function, inside my XML loader function, inside the onRelease function for my main menu (list one) nav i pass through the second list, mask and scrollbar:</p>
<blockquote><p><span class="Unicode">_root.listOneHolder['myNav'+i].onRelease = function ()</span><br />
<span class="Unicode">{</span><br />
<span class="Unicode"> goScrolling(_root.theScrollbar2, _root.maskedView2, _root.listTwoHolder);</span><br />
<span class="Unicode">}</span></p></blockquote>
<p>I then had two functioning scrollbars! However, I have run into two problems &#8230; one of which I have solved, the other won&#8217;t take long but I have not yet done. I clicked on one of the main menu items. List two was long enough to have a scrollbar and I then scrolled to the bottom and selected one of the projects (or secondary menu items). When I went to another category, I realized list two did not reset itself. The <span class="Unicode">_y</span> property was still at the same value, as if I had used the scrollbar. SO. I added to the end of the scrolling function a short bit of logic:</p>
<blockquote><p><span class="Unicode">// the number 55 represents the starting _y value</span><br />
<span class="Unicode">if (initContentPos &lt; 55)</span><br />
<span class="Unicode">{</span><br />
<span class="Unicode"> listHolder_mc._y = 55;</span><br />
<span class="Unicode">}</span></p></blockquote>
<p>Here&#8217;s a <a href="http://www.erinpierce.com/clients/ae" target="_blank">link to the project</a> as it is today. The second issue I found has to do with the mathematical calculation of height and/or how far down the scroll bar needs to go. The scroll current goes too far down, or rather, sets the <span class="Unicode">_y</span> property too low. So now I am off to fix that. I&#8217;ll post in the comments the solution when I have it.</p>
<p>Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pixologyinteractive.com/2009/06/adding-a-scrollbar-to-a-dynamicly-populated-menu-list-in-actionscript-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
