HI!
Hab mir ein Menü gebaut, das über eine XML Einträge einliest. Das Problem dabei ist, dass wenn man auf die Menüs schnell hintereinander klickt die Positionierung der Submenüs über Bord geht. Ich vermute, dass es etwas mit dem Tween zu tun hat. Da er noch nicht fertig ist und durch einen neuen Aufruf überschrieben wird(siehe trace werte).
XML: (menues.xml)
Code:
<?xml version="1.0" encoding="utf-8"?>
<menues>
<menuitems>
<menu>fotografie</menu>
<submenu>mensch</submenu>
<submenu>stadt</submenu>
<submenu>land</submenu>
</menuitems>
<menuitems>
<menu>grafikdesign</menu>
<submenu>test1</submenu>
<submenu>hund</submenu>
</menuitems>
<menuitems>
<menu>malerei</menu>
<submenu>katze</submenu>
<submenu>katze2</submenu>
<submenu>katze3</submenu>
<submenu>katze4</submenu>
</menuitems>
<menuitems>
<menu>zeichnungen</menu>
</menuitems>
<menuitems>
<menu>info</menu>
</menuitems>
</menues>
AS3:
PHP-Code:
package {
import caurina.transitions.Tweener;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.text.*;
import flash.xml.XMLDocument;
import flash.xml.XMLNode;
[SWF(width='1024', height='700', backgroundColor='#FFFFFF', framerate='25')]
public class MeineSeite extends Sprite
{
public var menues:Array = new Array();
public var g_xml:XML;
public var xmlReq:URLRequest = new URLRequest("menues.xml");
public var xmlLoader:URLLoader = new URLLoader();
public var isOpenArr:Array = new Array();
public var mainMenuItems:Array = new Array();
public var subMenuItems:Array = new Array();
public var subMenuEntries:Array = new Array();
public var menuArr:Array = new Array();
public var menuPosX:uint = 30;
public var menuPosY:uint = 230;
public var mainMenuTextFormat:TextFormat = new TextFormat();
public var subMenuTextFormat:TextFormat = new TextFormat();
public var headlineTextFormat:TextFormat = new TextFormat();
public var letterWidth:uint = 100;
public var letterHeight:uint= 30;
public var menuSpacing:uint;
public var subMenuSpacing:uint;
public var testSprite:Sprite = new Sprite();
public var _open:Boolean;
public var getEventNumber:Number;
public var menuCount:Number = 4;
public function MeineSeite()
{
xmlLoader.load(xmlReq);
xmlLoader.addEventListener(Event.COMPLETE,loadedXML);
}
// XML reinladen und befüllen
public function loadedXML(e:Event):void
{
g_xml = new XML(xmlLoader.data);
var ixml:XML = new XML(e.target.data);
var myXML:XMLDocument = new XMLDocument();
myXML.ignoreWhite = true;
myXML.parseXML(ixml.toString());
var xnode:XMLNode = myXML.firstChild;
var nodeName:String = "menuitems";
var iCounter:int = ixml.elements(nodeName).length();
for(var i:uint = 0; i < iCounter;i++)
{
var initOpen:Boolean = false;
isOpenArr.push(initOpen);
var item:XML = g_xml.menuitems[i];
menues[i] = new Array();
var xCounter:uint;
for each (var node:XML in item.elements())
{
menues[i][xCounter] = node;
xCounter++;
}
xCounter = 0;
}
makeMenu();
}
public function makeMenu():void
{
// Mainmenue Buttons
for(var i:uint = 0;i<menues.length;i++)
{
var mainMenuTextField:TextField = new TextField();
mainMenuTextField.x = menuPosX;
mainMenuTextField.y = menuPosY + menuSpacing;
mainMenuTextField.name = ""+i+"";
mainMenuTextField.width = letterWidth;
mainMenuTextField.height = letterHeight;
mainMenuTextField.selectable = false;
mainMenuTextField.htmlText = "<a href='event:Test'>"+menues[i][0]+"</a>";
mainMenuTextField.addEventListener(MouseEvent.CLICK, closeopenSubMenu);
mainMenuItems.push(mainMenuTextField);
addChild(mainMenuItems[i]);
menuSpacing += 30;
}
}
public function makeSubMenu(targetNumber:uint,targetYPos:uint):void
{
// SubMenu Buttons
subMenuEntries[targetNumber] = new Array();
if(menues[targetNumber].length > 1)
{
for(var j:uint = 1;j< menues[targetNumber].length;j++)
{
var subMenuTextField:TextField = new TextField();
var jCounter:int = j-1;
subMenuTextField.x = menuPosX ;
subMenuTextField.y = targetYPos ;
subMenuTextField.width = letterWidth ;
subMenuTextField.height = letterHeight ;
subMenuTextField.selectable = false;
subMenuTextField.htmlText = "<a href='event:Test2'>"+menues[targetNumber][j]+"</a>";
subMenuTextField.addEventListener(MouseEvent.CLICK, SubMenuOpen);
subMenuEntries[targetNumber][jCounter] = subMenuTextField;
}
}
}
public function closeopenSubMenu(e:Event):void
{
var targetNumber:Number = e.target.name;
var targetInc:uint = targetNumber +1;
// falls das menu noch nicht offen ist dann.....
if((isOpenArr[targetNumber] == false) && (menues[targetNumber].length > 1))
{
subMenuSpacing = 0;
//menues und submenues(falls schon vorhanden) nach unten verschieben
for(var a:uint = targetInc;a <= mainMenuItems.length-1;a++)
{
mainMenuItems[a].y += (menues[targetNumber].length -1) * (letterHeight);
}
for(var p:uint = targetInc;p < menues.length;p++)
{
if((isOpenArr[p] == true) && (subMenuEntries[p]!=undefined) )
{
for each(var obj:Object in subMenuEntries[p])
{
obj.y += (menues[targetNumber].length -1) * (letterHeight);
trace(obj.y);
}
}
}
var targetYPos:uint =mainMenuItems[targetNumber].y;
//erstellen des gewuenschten submenues
makeSubMenu(targetNumber,targetYPos);
//bewegen des submenues
for(var i :uint = 0;i<subMenuEntries[targetNumber].length;i++)
{
subMenuSpacing += 30;
var spaceCount:Number = targetYPos + subMenuSpacing ;
Tweener.addTween(subMenuEntries[targetNumber][i],{y:spaceCount,time:0.7,transition:"easeOutExpo"});
subMenuEntries[targetNumber][i].x = menuPosX +10;
addChild(subMenuEntries[targetNumber][i]);
}
isOpenArr[targetNumber] = true;
}
// ist das menue schon offen dann......
else if ((isOpenArr[targetNumber] == true) &&(menues[targetNumber].length > 1))
{
// SubMenu zusammenziehen
for(var r:uint = targetInc;r < menues.length;r++)
{
if((isOpenArr[r] == true) && (subMenuEntries[r]!=undefined) )
{
for each(var obj2:Object in subMenuEntries[r])
{
obj2.y -= (menues[targetNumber].length -1) * (letterHeight);
trace(obj2.y);
}
}
}
// Menu zusammenziehen und loeschen der elemente
for(var b:uint = targetInc;b <= mainMenuItems.length-1;b++)
{
mainMenuItems[b].y -= (menues[targetNumber].length - 1) * (letterHeight);
}
// loeschen der submenues
for(var j :int = 0 ; j < subMenuEntries[targetNumber].length ; j++)
{removeChild(subMenuEntries[targetNumber][j]);
}
// loeschen der submenues aus dem array
for(var k:Number = subMenuEntries[targetNumber].length;k >= 0 ; k-- )
{
subMenuEntries[targetNumber].pop();
}
subMenuSpacing = 0;
isOpenArr[targetNumber] = false;
}
}
public function SubMenuOpen(e:Event):void
{
trace("subclick");
}
}
}