UI布局总是一个麻烦。无论是什么布局系统,我都'我所做的,我永远不会满意它100%。一些缺乏简单性,其他人缺乏控制。最近我回到了一个我呼叫ectcut的方法。它很简单,它可以控制非常复杂的布局。
现在,您可能已经猜到了RECCUT基于切割矩形。并开始......好的矩形:
螺旋切割(螺旋*螺旋,浮子A){浮法Minx = Rect-> minx; rent-> minx = min(rect-> max.x,int-> minx + a);返回(RECT){MINX,RECT-> MINY,RECT-> MINX,RECT-和GT; MAXY};} rect_right(RECT * RECT,FLOAT A){FLOAT MAXX = RECT-> MAXX; RECT-> maxx = max(rect-> minx,rect-> maxx-a);返回(RECT){RECT-> MAXX,RECT-> MINY,MAXX,RECT-和GT; MAXY}; rect_top(rect * rect,float a){float miny = ent-> miny; rent-> miny = min(rect-> max.y,rect-> miny + a);返回(rect){ent-> minx,miny,int-> maxx,rect-> miny};} rect cut_bottom(rect * rectom,float a){float maxy = ent-> maxy; maxy; maxy; rect-> maxy = max(rect->矿物,rect-> maxy-a);返回(rect){ent-> minx,rect-> maxy,rect-> maxx,maxy};}
这些功能剪切了一个输入矩形的较小矩形并返回它。诀窍在于它们还修改了输入矩形。
矩形布局= {0,0,180,16}; rect r1 = cut_left(&布局,16); rect r2 = cut_left(&布局,16); rect r3 = cut_left(&布局,16); rect r4 = cut_right(&布局,16); rect r5 = cut_right(&布局,16);
//顶部栏与图标和titlect top = cut_top(&布局,16); rect button_close = cut_right(& top,16); rect button_maximize = cut_right(& top,16); rect button_minimize = cut_right(& top,16); rect title = top; // bottom bar.rect bottom = cut_bottom(&布局,16); left和lex panels.rect panel_left = cut_left(&布局,w / 2); rect panel_right =布局;
有时候有需要首先计算尺寸,然后切断适当的数量。典型示例是标签尺寸的按钮:
BOOL按钮(RECT *布局,CONST CHAR *标签){float size = mefory_text(标签); rect rect = cut_left(布局,大小); //交互// draw}
这里的问题是,按钮将始终调用cut_left,因此您不能使用它来拥有一个工具栏,左右右侧有按钮。您想从按钮功能的来电者控制一侧。
枚举entcutside {etccut_left,rectcut_right,etccut_top,etccut_bottom,}; struct etccut {rect * rect; entcutside side;}; etccut enctcut(rect * rect,entccutside侧){return(rectcut){.rect = rect,.side = side}; rectctcut_cut(etccut rectcut,float a){switch(etccut.side){案例rectcut_left:返回cut_left(etccut-> rect,a);案例rectcut_right:返回cut_right(etccut-> rect,a);案例rectcut_top:返回cut_top(etccut-> rect,a);案例rectcut_bottom:返回cut_bottom(etccut-> rect,a);默认值:abort(); }}
BOOL按钮(RECTCUT布局,CONST CHAR *标签){float size = mefory_text(标签); rect rect = rectcut_cut(布局,大小); //交互// draw}
现在我们可以通过他们的内容控制来自来电者的一侧,并通过他们的内容具有按钮
//与切割相同,除了它们保持输入的输入端完好无同.//对装饰有用(9-patch-weash?)。rect get_left(const rect * rect,float a); rect get_right(const rect * rect,float a ); rect get_top(const rect * rect,float a); rect get_bottom(const rect * rect,float a);它们将在输入矩形外部添加一个矩形,用于工具提示和其他覆盖元素.rect add_left(const rect * rect,float a); rect_right(const rect * rect,float a); rect_top(const rect * rect,float a); rect_bottom(const rect * rect,float a);
此外,您可以为RECT实施的扩展和合同函数,这对边框和悬垂有用。
RECCUT也可以扩展,以支持限制最大和最小宽度和高度,以便更好地控制布局属性。 (i' ve用nan表示" don' t应用"对于每个限制)。 希望这将使你解除一些咬伤并使你停止实施不工作的超前布局。 我也犯了罪。