package com.renaun.controls
{ import feathers.controls.Label; import feathers.core.FeathersControl; import starling.display.DisplayObject; public class Group extends FeathersControl { public function Group() { super(); } protected var children:Vector.<FeathersControl> = new Vector.<FeathersControl>(); protected var childrenPercentValues:Vector.<int> = new Vector.<int>(); protected var explicitTotal:Number; protected var percentTotalValue:Number; protected var isValid:Boolean = false; protected var isFirstTime:Boolean = false; /** * Currently you have to add items in order, there is not addLayoutItemAt. * * @param item The target item you want to add to this group, add in order * @param percentHeight The percent value of the VGroup's height. 100 = 100%, and if the total percent is> 100 it will be scaled by the value/totalPrecents. */ public function addLayoutItem(item:FeathersControl, percentValue:int = -1):void { addChild(item); children.push(item); item.onResize.add(resizeHandler); childrenPercentValues.push(percentValue); measure(); invalidate(); } override protected function initialize():void { //trace("init"); super.initialize(); isFirstTime = true; } protected function measure():void { } protected function resizeHandler(target:FeathersControl, oldWidth:Number, oldHeight:Number):void { /* if (target is Label) trace("resizeHandler2["+(target as Label).text+"]: " + oldWidth + " - " + width); else trace("resizeHandler2["+target+"]: " + oldWidth + " - " + width); */ isValid = false; invalidate(); } } }
package com.renaun.controls { import feathers.core.FeathersControl; import starling.display.DisplayObject; public class VGroup extends Group { public function VGroup() { super(); } public var gap:int = 8; public var paddingLeft:int = 8; public var paddingRight:int = 8; public var paddingTop:int = 8; public var paddingBottom:int = 8; override protected function measure():void { var item:DisplayObject; explicitTotal = -gap; percentTotalValue = 0; var i:int; for (i = 0; i <children.length; i++) { item = children[i]; if (childrenPercentValues[i]> 0) percentTotalValue += childrenPercentValues[i]; else { if (item is FeathersControl) { //item.height = (item as BitmapFontTextRenderer).measureText().y; (item as FeathersControl).validate(); } explicitTotal = explicitTotal + item.height; } explicitTotal += gap; } isValid = true; } override protected function draw():void { // Delay items width/height are still not valid inside initalize method so have to wait for draw if (isFirstTime) { measure(); isFirstTime = false; } var availableHeightForPercents:Number = explicitHeight - explicitTotal - paddingTop - paddingBottom; //trace("availableHeightForPercents: " + availableHeightForPercents + " - " + explicitTotal + " - " + explicitHeight); // Make smaller if the percents add up more then 100 if (percentTotalValue> 100) availableHeightForPercents = availableHeightForPercents / (percentTotalValue / 100); //trace("percentTotalValue: " + percentTotalValue + " aHFP: " + availableHeightForPercents + " - " + explicitTotal + " - " + explicitHeight); var percentHeightValue:int = 0; var lastHeight:int = 0; var i:int; var item:DisplayObject; for (i = 0; i <children.length; i++) { item = children[i]; // Set Y item.y = lastHeight + paddingTop; if (childrenPercentValues[i]> 0) { percentHeightValue = childrenPercentValues[i]; // Set HEIGHT item.height = int(availableHeightForPercents * percentHeightValue / 100); } lastHeight += item.height + gap; // Set X item.x = paddingLeft; // Set WIDTH item.width = explicitWidth - paddingLeft - paddingRight; //trace("lastHeight : " + lastHeight); } } } }
var vgroup:VGroup = new VGroup(); vgroup.addLayoutItem(renderer); vgroup.addLayoutItem(list, 100); vgroup.addLayoutItem(appCountLabel); addChild(vgroup);
转自:http://renaun.com/blog/2012/10/playing-with-feathers-ui-components-for-starling-framework/