Når så kunne jeg ikke holde fingerne væk aligevel.
jeg har lige smækket en Grid sorting class sammen på en time her om natten i det lidt våde norge.
Klassen virker ved at man tilføjer nogle display objekter til dens interne list, og så hver gang du ændre højde, bredte, v og hspacing så resorter den alle objekterne der er tilknyttet.
Selve klassen er ikke lavet som et display objekt (selv om det nemt kunne), så de skal være added til en displayliste et andet sted.
her er selve klassen
package dk.tommyka.layout
{
import dk.tommyka.v3.layout.events.LayoutEvent;
import flash.display.DisplayObject;
import flash.display.Sprite;
/**
* ...
* @author Tommyka
*/
public class Grid
{
private var _width:Number = 400;
private var _height:Number = 400;
private var _vspacing:int = 10;
private var _hspacing:int = 10;
private var _children:Array;
public function Grid(children:Array)
{
_children = children || [];
for (var i:uint = 0; i < _children.length; i++)
{
_children[i].addEventListener(LayoutEvent.RESORT, onResort, false, 0, true);
}
}
private function resort():void
{
var mw:Number = 0; //max width;
var mh:Number = 0; //max height;
var numChildren:int = _children.length;
var child:DisplayObject;
for (var i:uint = 0; i < numChildren; i ++)
{
child = _children[i];
if (child.width > mw)
{
mw = child.width;
}
if (child.height > mh)
{
mh = child.height;
}
}
var dx:int = int(mw) + _vspacing;
var dy:int = int(mh) + _hspacing;
var rows:int = Math.floor(_height / dy);
var cols:int = Math.floor(_width / dx);
for (i = 0; i < numChildren; i++)
{
child = _children[i];
child.x = dx * (i % cols);
child.y = dy * Math.floor(i / cols);
}
}
public function addChild(child:DisplayObject):void
{
_children.push(child);
child.addEventListener(LayoutEvent.RESORT, onResort, false, 0, true);
resort();
}
private function onResort(e:LayoutEvent):void
{
resort();
}
public function get width():Number { return _width; }
public function set width(value:Number):void
{
_width = value;
resort();
}
public function get height():Number { return _height; }
public function set height(value:Number):void
{
_height = value;
resort();
}
public function get vspacing():int { return _vspacing; }
public function set vspacing(value:int):void
{
_vspacing = value;
resort();
}
public function get hspacing():int { return _hspacing; }
public function set hspacing(value:int):void
{
_hspacing = value;
resort();
}
}
}
der er også en event klasse med som man kan bruge hvis nogle af de nestede elementer ændre størelse, så kan man bruge den til at sige, HEY resort lige det hele.
package dk.tommyka.layout.events
{
import flash.events.Event;
/**
* ...
* @author Tommyka
*/
public class LayoutEvent extends Event
{
static public const RESORT:String = "resort";
public function LayoutEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
public override function clone():Event
{
return new LayoutEvent(type, bubbles, cancelable);
}
public override function toString():String
{
return formatToString("LayoutEvent", "type", "bubbles", "cancelable", "eventPhase");
}
}
}