I used the evtimmy sample, it seems working with some modifications
/package layouts
{
import mx.core.ILayoutElement;
import spark.components.supportClasses.GroupBase;
import spark.layouts.supportClasses.LayoutBase;
public class FlowLayout extends LayoutBase
{
//---------------------------------------------------------------
//
// Class properties
//
//---------------------------------------------------------------
//---------------------------------------------------------------
// horizontalGap
//---------------------------------------------------------------
private var _horizontalGap:Number = 10;
public function set horizontalGap(value:Number):void
{
_horizontalGap = value;
// We must invalidate the layout
var layoutTarget:GroupBase = target;
if (layoutTarget)
layoutTarget.invalidateDisplayList();
}
//---------------------------------------------------------------
// verticalGap
//---------------------------------------------------------------
private var _verticalGap:Number = 10;
public function set verticalGap(value:Number):void
{
_verticalGap = value;
// We must invalidate the layout
var layoutTarget:GroupBase = target;
if (layoutTarget)
layoutTarget.invalidateDisplayList();
}
//---------------------------------------------------------------
// verticalAlign
//---------------------------------------------------------------
private var _verticalAlign:String = "bottom";
public function set verticalAlign(value:String):void
{
_verticalAlign = value;
// We must invalidate the layout
var layoutTarget:GroupBase = target;
if (layoutTarget)
layoutTarget.invalidateDisplayList();
}
//---------------------------------------------------------------
// horizontalAlign
//---------------------------------------------------------------
private var _horizontalAlign:String = "left"; // center, right
public function set horizontalAlign(value:String):void
{
_horizontalAlign = value;
// We must invalidate the layout
var layoutTarget:GroupBase = target;
if (layoutTarget)
layoutTarget.invalidateDisplayList();
}
//---------------------------------------------------------------
//
// Class methods
//
//---------------------------------------------------------------
override public function
updateDisplayList(containerWidth:Number,
containerHeight:Number):void
{
var element:ILayoutElement;
var layoutTarget:GroupBase = target;
var count:int = layoutTarget.numElements;
var hGap:Number = _horizontalGap;
var vGap:Number = _verticalGap;
// The position for the current element
var x:Number = 0;
var y:Number = 0;
var elementWidth:Number;
var elementHeight:Number;
var vAlign:Number = 0;
switch (_verticalAlign)
{
case "middle" : vAlign = 0.5; break;
case "bottom" : vAlign = 1; break;
}
// Keep track of per-row height, maximum row width
var maxRowWidth:Number = 0;
// loop through the elements
// while we can start a new row
var rowStart:int = 0;
while (rowStart < count)
{
// The row always contains the start element
element = useVirtualLayout ?
layoutTarget.getVirtualElementAt(rowStart)
:
layoutTarget.getElementAt(rowStart);
var rowWidth:Number =
element.getPreferredBoundsWidth();
var rowHeight:Number =
element.getPreferredBoundsHeight();
// Find the end of the current row
var rowEnd:int = rowStart;
while (rowEnd + 1 < count)
{
element = useVirtualLayout ?
layoutTarget.getVirtualElementAt(rowEnd +
1) :
layoutTarget.getElementAt(rowEnd + 1);
// Since we haven't resized the element
just yet, get its preferred
size
elementWidth =
element.getPreferredBoundsWidth();
elementHeight =
element.getPreferredBoundsHeight();
// Can we add one more element to this
row?
if (rowWidth + hGap + elementWidth >
containerWidth)
break;
rowWidth += hGap + elementWidth;
rowHeight = Math.max(rowHeight,
elementHeight);
rowEnd++;
}
x = 0;
switch (_horizontalAlign)
{
case "center" : x =
Math.round(containerWidth - rowWidth) / 2; break;
case "right" : x = containerWidth -
rowWidth;
}
// Keep track of the maximum row width so that
we can
// set the correct contentSize
maxRowWidth = Math.max(maxRowWidth, x +
rowWidth);
// Layout all the elements within the row
for (var i:int = rowStart; i <= rowEnd; i++)
{
element = useVirtualLayout ?
layoutTarget.getVirtualElementAt(i) :
layoutTarget.getElementAt(i);
// Resize the element to its preferred
size by passing
// NaN for the width and height
constraints
element.setLayoutBoundsSize(NaN, NaN);
// Find out the element's dimensions
sizes.
// We do this after the element has
been already resized
// to its preferred size.
elementWidth =
element.getLayoutBoundsWidth();
elementHeight =
element.getLayoutBoundsHeight();
// Calculate the position within the row
var elementY:Number =
Math.round((rowHeight - elementHeight) * vAlign);
// Position the element
element.setLayoutBoundsPosition(x, y +
elementY);
x += hGap + elementWidth;
}
// Next row will start with the first element
after the current row's
end
rowStart = rowEnd + 1;
// Update the position to the beginning of the
row
x = 0;
y += vGap + rowHeight;
}
y -= vGap;
// Set the content size which determines the scrolling
limits
// and is used by the Scroller to calculate whether to
show up
// the scrollbars when the the scroll policy is set to
"auto"
layoutTarget.setContentSize(maxRowWidth, y);
layoutTarget.invalidateSize();
}
override public function measure():void
{
var layoutTarget:GroupBase = target;
if (!layoutTarget)
return;
// Use Math.ceil() to make sure that if the content
partially occupies
// the last pixel, we'll count it as if the whole pixel
is occupied.
layoutTarget.measuredWidth =
Math.ceil(layoutTarget.contentWidth);
layoutTarget.measuredHeight =
Math.ceil(layoutTarget.contentHeight);
}
}
}/
--
Sent from: http://apache-flex-users.2333346.n4.nabble.com/