我有一个流程布局。在里面我有大约900张桌子。每张桌子一个堆叠在另一个上面。我有一个滑块调整它们的大小,从而导致流程布局也调整大小。
问题是,表格应该线性调整大小。它们的基本尺寸为200x200。因此,当scale = 1.0时,表格的w和h为200。
每次调整大小时,每次调整大小会增加4%。这意味着我希望它们每次增长8个像素。会发生什么,每隔几个调整大小,表增长9个像素。我到处都用双打。我尝试了四舍五入,地板和天花板,但问题仍然存在。我能做些什么才能让他们总是以正确的数量增长?
void LobbyTableManager::changeTableScale( double scale )
{
setTableScale(scale);
}
void LobbyTableManager::setTableScale( double scale )
{
scale += 0.3;
scale *= 2.0;
std::cout << scale << std::endl;
agui::Gui* gotGui = getGui();
float scrollRel = m_vScroll->getRelativeValue();
setScale(scale);
rescaleTables();
resizeFlow();
...
double LobbyTableManager::getTableScale() const
{
return (getInnerWidth() / 700.0) * getScale();
}
void LobbyFilterManager::valueChanged( agui::Slider* source,int val )
{
if(source == m_magnifySlider)
{
DISPATCH_LOBBY_EVENT
{
(*it)->changeTableScale((double)val / source->getRange());
}
}
}
void LobbyTableManager::renderBG( GraphicsContext* g, agui::Rectangle& absRect, agui::Rectangle& childRect )
{
int cx, cy, cw, ch;
g->getClippingRect(cx,cy,cw,ch);
g->setClippingRect(absRect.getX(),absRect.getY(),absRect.getWidth(),absRect.getHeight());
float scale = 0.35f;
int w = m_bgSprite->getWidth() * getTableScale() * scale;
int h = m_bgSprite->getHeight() * getTableScale() * scale;
int numX = ceil(absRect.getWidth() / (float)w) + 2;
int numY = ceil(absRect.getHeight() / (float)h) + 2;
float offsetX = m_activeTables[0]->getLocation().getX() - w;
float offsetY = m_activeTables[0]->getLocation().getY() - h;
int startY = childRect.getY() + 1;
if(moo)
{
std::cout << "TS: " << getTableScale() << " Scr: " << m_vScroll->getValue() << " LOC: " << childRect.getY() << " H: " << h << std::endl;
}
if(moo)
{
std::cout << "S=" << startY << ",";
}
int numAttempts = 0;
while(startY + h < absRect.getY() && numAttempts < 1000)
{
startY += h;
if(moo)
{
std::cout << startY << ",";
}
numAttempts++;
}
if(moo)
{
std::cout << "\n";
moo = false;
}
g->holdDrawing();
for(int i = 0; i < numX; ++i)
{
for(int j = 0; j < numY; ++j)
{
g->drawScaledSprite(m_bgSprite,0,0,m_bgSprite->getWidth(),m_bgSprite->getHeight(),
absRect.getX() + (i * w) + (offsetX),absRect.getY() + (j * h) + startY,w,h,0);
}
}
g->unholdDrawing();
g->setClippingRect(cx,cy,cw,ch);
}
void LobbyTable::rescale( double scale )
{
setScale(scale);
float os = getObjectScale();
double x = m_baseHeight * os;
if((int)(x + 0.5) > (int)x)
{
x++;
}
int oldH = getHeight();
setSize(m_baseWidth * os, floor(x));
...
我添加了相关代码。滑块发送一个更改的值,乘以得到4%的增加(如果滑块移动2个值等,则为8%......)然后用这个重新调整表格。
前三个是表格大小增加9,第四次增加8px。但比例因子每次增加0.04。
为什么第四次不一致?
模式看起来像8,8,8,9,9,9,8,8,8,9,9,9 ......
对于少数增加1个像素,然后减少1个10增加1等,这就是我的问题......
答案 0 :(得分:4)
我仍然没有在那里看到“添加4%”的代码(无论如何我都能理解这种形式),但是根据你的描述,我认为我看到了问题:两次增加4%不会增加8%。它增加了8.16%(1.04 * 1.04 == 1.0816)。多做几次,你将开始获得9个像素的跳跃。做了很多次,你的跳跃会变得更大(当尺寸达到400x400时,它们将是16像素的跳跃)。其中,恕我直言,我喜欢我的缩放发生。