почему этот класс макета не всегда работает? - PullRequest
0 голосов
/ 14 февраля 2011

Это моя попытка написать собственный класс макета для панели кнопок (которая может иметь от 2 до 20 кнопок). Как правило, все они должны быть одинакового размера, с постоянным интервалом (5 пикселей) и иметь соответствующий размер.

Однако это не всегда работает.

Иногда он работает абсолютно нормально, но в других он дает место для дополнительного столбца или становится неспособным добавить дополнительные столбцы при изменении размера (удаление столбцов - это нормально), или что-то не работает. И это занимает много времени и кажется ужасно дорогим с точки зрения вычислений. По некоторым причинам уменьшение ширины кажется значительно более болезненным в этом отношении.

В любом случае, вот оно:

package layouts
{
    import mx.core.ILayoutElement;

import spark.components.supportClasses.GroupBase;
import spark.layouts.supportClasses.LayoutBase;

public class QButtonsLayout extends LayoutBase
{
    public function QButtonsLayout()
    {
        super();
    }

    override public function measure():void
    {
        super.measure();

        target.measuredHeight = 130;

    }

    override public function updateDisplayList(w:Number, h:Number):void
    {
        super.updateDisplayList(w,h);

        var tCount:int = target.numElements; // Number of elements
        var tW:Number = target.width; // Width of target (button area) - somewhere between 550 and 1000px

        var maxW:Number = 1; // Largest natural width of any given element
        var maxH:Number = 1; // Largest natural height of any given element

        var eSetW:Number = 1; // Set (to be) width of each element upon the target
        var eSetH:Number = 1; // Set (to be) height of each element upon the target

        var tCols:Number = 1; // Number of columns upon the target
        var tRows:Number = 1; // Number of rows upon the target 

        for (var i:int = 0; i<tCount; i++) // Find maxW
        {
            var layoutElement:ILayoutElement = useVirtualLayout ? target.getVirtualElementAt(i):target.getElementAt(i);         
            var thisW:Number = layoutElement.getPreferredBoundsWidth();
            var thisH:Number = layoutElement.getPreferredBoundsHeight();

            if(thisW > maxW)
            {
                maxW = thisW;
            };

            if(thisH > maxH)
            {
                maxH = thisH;
            };
        }

        tCols = Math.floor((tW-5)/(maxW+5)); //Find maximum number of columns one can fit onto the target

        if(tCols>tCount) //Fix to deal with cases with low tCounts
        {
            tCols = tCount;
        };

        tRows = Math.ceil(tCount/tCols); //Find corresponding number of rows

        eSetW = ((tW-5)/tCols)-5; //Set widths of elements based upon number of columns, 5s to add some space between elements
        eSetH = maxH; //Takes height as the largest height

        for (var j:int = 0; j<tCount; j++)
        {
            var layoutElement2:ILayoutElement = useVirtualLayout ? target.getVirtualElementAt(j):target.getElementAt(j);

            var eRow:int = Math.floor(j/tRows); //Row of given element, taking the 1st to be zero
            var eCol:int = j - eRow*tRows; // Column of given element, again taking the 1st column as zero

            var _x:Number = 5 + eRow*(eSetW+5);
            var _y:Number = 5 + eCol*(eSetH+5);

            layoutElement2.setLayoutBoundsPosition(_x,_y);
            layoutElement2.setLayoutBoundsSize(eSetW,eSetH);
        }           
    }
}
}

Любые мысли приветствуются.

Критика более чем приветствуется.

1 Ответ

0 голосов
/ 16 февраля 2011

Оказывается, это не так.С самим классом компоновки все в порядке, что касается расчета положения и размера элемента.

Это на самом деле проблема в том, как используемые кнопки вычисляли свою предпочтительную ширину.Хотя я не разбираюсь в том, как это происходит, это было решено путем удаления значений% width для любых значений высоты и ширины для графических элементов в оболочках кнопок.(Например, изменение ширины = "100%" влево = "0" вправо = "0").

Надеюсь, это может кому-нибудь когда-нибудь пригодиться.

...