SOUI控件在使用线性布局时可使用weight属性来达到子控件按比例分配父控件剩余空间的效果。通过灵活使用这个属性可以达到很多效果,下面通过一个例子来说明其使用。
首先上XML
<window size="-2,-2" layout="vbox" inset="22,60,22,0" interval="6">
<text text="程序已用空间"/>
<text colorText="@color/meused" font="adding:6">10.1G</text>
<window size="-2,-1" layout="hbox">
<window name="meused" size="0,14" colorBkgnd="@color/meused"/>
<window name="dskused" size="0,-2" colorBkgnd="@color/dskused"/>
<window name="dskfree" size="0,-2" colorBkgnd="@color/dskfree"/>
</window>
<window size="-1,-1" layout="hbox" interval="2" gravity="center">
<window size="10,10" colorBkgnd="@color/meused"/>
<text text="自己已用空间" colorText="@color/dskused"/>
<window size="10,10" extend_left="20" colorBkgnd="@color/dskused"/>
<text text="磁盘已用空间" colorText="@color/dskused"/>
<window size="10,10" extend_left="20" colorBkgnd="@color/dskfree"/>
<text text="磁盘可用空间" colorText="@color/dskused"/>
</window>
</window>
上面使用size=0再通过动态设置weight即可达到动态分配大小的效果。动态设置这里使用一个函数实现。
void CMainDlg::SetDsk(double meused, double dskused, double total)
{
SWindow* pWndMeUsed = FindChildByName(L"meused");
SWindow* pWndDskUsed = FindChildByName(L"dskused");
SWindow* pWndDskFree = FindChildByName(L"dskfree");
if (pWndMeUsed && pWndDskUsed && pWndDskFree)
{
pWndMeUsed->SetAttribute(L"weight",SStringT().Format(L"%d",int(meused)));
pWndDskUsed->SetAttribute(L"weight", SStringT().Format(L"%d", int(dskused- meused)));
pWndDskFree->SetAttribute(L"weight", SStringT().Format(L"%d", int(total- dskused)));
}
}
当然这里仅仅演示weight用法,具体算法可以更精确一些。初使化时调用SetDsk(10.1, 60.1, 200);
运行效果如下:
这也算SOUI的一种简洁之道,可以通过灵活的组合来达到减少造轮子的效果。