-2

假设我想创建一个对象网格,比如说按钮。我知道窗口的宽度和高度,也知道要添加的按钮数量。

是否有任何智能算法可以根据此计算每个按钮的宽度和高度?我试图想出一些东西,但是当我真的想填充整个窗口时,我得到的只是空白区域。

无论对象是什么,在这种情况下,为了简单起见,我都使用按钮。

简单地说,我想用一个对象(一个按钮)填充整个屏幕。如果只有一个按钮,该按钮将填充整个屏幕,则两个按钮将共享大小。

而且,如果我想将下一次运行的值更改为更多按钮,那么它也应该填满整个屏幕。

有任何想法吗?

4

2 回答 2

1

如果您有一排按钮,您只需将窗口的宽度除以按钮的数量,并将所有按钮的宽度设置为该值。

button.width  = window.width / numberOfButtons;
button.height = window.height;

如果您有多行,只需对高度执行相同操作;

button.width  = window.width  / numberOfButtonsH;
button.height = window.height / numberOfButtonsV;

如果您希望按钮具有更合理的尺寸,请尝试使用所需按钮数量的平方根来计算一行中的按钮数量。如果所需的按钮数量不均匀,则添加另一行并将该行中的最后一个按钮居中。

对于十七个按钮,您将有五行,前四行每行有四个按钮,最后一行有一个按钮。

可以这样做(编辑为使用临时数据结构):

int width  = 600;//replace those values with your own dimensions
int height = 600;

inline bool isUneven(const int i)
{
    return (i%2);
}

struct tempButton
{
    int x,y,w,h;
};

void populateWindow( const int requestedObjects = 18 )
{
    int objectsPerRow       = (int)floor(sqrt(requestedObjects));
    int rows = objectsPerRow;

    int diff = requestedObjects-rows*objectsPerRow;

    tempButton tmp[requestedObjects];

    if(diff>0)
    {
        ++rows;// only needed for button dimension calculation, will be changed later
    }

    int buttonWidth  = width  / objectsPerRow;
    int buttonHeight = height / rows;
    int lastRowWidth = 0; width / diff;

    for(int i=0; i<requestedObjects-diff; ++i)
    {
        tmp[i].h = buttonHeight;
        tmp[i].w = buttonWidth;
    }
    if(diff>0)
    {
        lastRowWidth = width / diff;
        for(int i=requestedObjects-diff; i<requestedObjects; ++i)
        {
            tmp[i].h = buttonHeight;
            tmp[i].w = lastRowWidth;
        }
        --rows; // subtract one, because placing the last button on its own is easier
    }
    for(int i=0; i<rows; ++i)
    {
        for(int j=0; j<objectsPerRow; ++j)
        {
            tmp[j+i*objectsPerRow].x = j*buttonWidth;        // set the positions
            tmp[j+i*objectsPerRow].y = i*buttonHeight;
        }
    }
    if(diff>0)
    {
        for(int i=requestedObjects-diff; i<requestedObjects; ++i)
        {
            tmp[i].x = (i-(requestedObjects-diff))*lastRowWidth;
            tmp[i].y = rows*buttonHeight;
        }

    }

    // now create the buttons using the temporary data

}
于 2012-07-11T13:43:15.630 回答
0

为此,您需要更多规则。

控件的数量必须是另外两个数字的乘积,所以正如有人建议的那样,17 只给你 17 * 1,所以按钮宽度是网格宽度/17,按钮高度是窗口高度,反之亦然,如果你喜欢一个柱子。

您可以尝试使用纵横比做一些事情以使这一点更有意义,例如宽度 > 高度意味着您应该排成一排。

如果控件的数量是一个产品,那么它将是一个正方形,或者您可以再次使用宽度/高度来计算按钮的宽度和高度。

您可能还想考虑按钮的最小宽度和高度,但是您会遇到更多不适合的问题。如果你想在每个按钮周围有一些填充,只需计算它,然后将按钮居中。

于 2012-07-11T14:05:03.547 回答