假设我想创建一个对象网格,比如说按钮。我知道窗口的宽度和高度,也知道要添加的按钮数量。
是否有任何智能算法可以根据此计算每个按钮的宽度和高度?我试图想出一些东西,但是当我真的想填充整个窗口时,我得到的只是空白区域。
无论对象是什么,在这种情况下,为了简单起见,我都使用按钮。
简单地说,我想用一个对象(一个按钮)填充整个屏幕。如果只有一个按钮,该按钮将填充整个屏幕,则两个按钮将共享大小。
而且,如果我想将下一次运行的值更改为更多按钮,那么它也应该填满整个屏幕。
有任何想法吗?
如果您有一排按钮,您只需将窗口的宽度除以按钮的数量,并将所有按钮的宽度设置为该值。
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
}
为此,您需要更多规则。
控件的数量必须是另外两个数字的乘积,所以正如有人建议的那样,17 只给你 17 * 1,所以按钮宽度是网格宽度/17,按钮高度是窗口高度,反之亦然,如果你喜欢一个柱子。
您可以尝试使用纵横比做一些事情以使这一点更有意义,例如宽度 > 高度意味着您应该排成一排。
如果控件的数量是一个产品,那么它将是一个正方形,或者您可以再次使用宽度/高度来计算按钮的宽度和高度。
您可能还想考虑按钮的最小宽度和高度,但是您会遇到更多不适合的问题。如果你想在每个按钮周围有一些填充,只需计算它,然后将按钮居中。