相對(duì)布局與絕對(duì)布局的的意義與用法我使用duilib快3個(gè)月了,總體感覺(jué)duilib的使用還是較為簡(jiǎn)單的,只是剛?cè)腴T(mén)時(shí)可能有些摸不清頭腦。今天寫(xiě)一篇關(guān)于duilib的入門(mén)日志,大致說(shuō)一下duilib中的各個(gè)布局的作用,以及很關(guān)鍵的相對(duì)布局與絕對(duì)布局的意義與用法。希望可以幫到使用duilib的新手朋友們。duilib高手就可以直接省略這篇文章了!我剛使用duilib的時(shí)候非常依賴duilib自帶的設(shè)計(jì)器,用他可以拖拉控件,可視化的做出自己想要的界面。可是用一段時(shí)間就會(huì)發(fā)現(xiàn)原帶的設(shè)計(jì)器有很多bug,時(shí)不時(shí)會(huì)崩潰,支持的控件數(shù)量有限,屬性數(shù)量也有限,導(dǎo)出的代碼冗余。當(dāng)時(shí)問(wèn)了幾個(gè)高手,大家建議不要使用設(shè)計(jì)器而應(yīng)該自己手寫(xiě)xml代碼。起初手寫(xiě)時(shí)感覺(jué)特別麻煩,可是用幾天后你會(huì)發(fā)現(xiàn)手寫(xiě)要比使用設(shè)計(jì)器好得多:你可以更加了解duilib,熟悉每個(gè)控件的各個(gè)屬性,對(duì)控件的控制也更加方便。而如果想稱心如意的脫離設(shè)計(jì)器去編寫(xiě)xml文件,有非常有必要弄明白各個(gè)布局的用法和布局技巧。追劇爺爺都是從孫子走過(guò)來(lái)的,在美華人反歧視紀(jì)錄片入圍奧斯卡!我現(xiàn)在可以完全靠手寫(xiě)xml來(lái)做出一個(gè)程序的界面,相信用了一段duilib的朋友也是這樣在知道了6大布局的用法之后,攝影師給你6個(gè)提高風(fēng)光攝影水平的建議,知道了各種樣式的界面外觀的大致布局方法,而這還遠(yuǎn)不夠讓我們寫(xiě)出漂亮的布局外觀,只有配合相對(duì)布局與絕對(duì)布局才可以更好的控制界面的元素。值得一提的是,我這里說(shuō)的相對(duì)布局和絕對(duì)布局并不是一個(gè)容器或者控件,這只是一種技巧和使用方法,用在容器布局所包含的控件上,常用到橫縱向布局中我先來(lái)介紹絕對(duì)布局,籠統(tǒng)上說(shuō)絕對(duì)布局和相對(duì)布局其實(shí)只有一個(gè)差別,也就是我在前面提到的float屬性,容器中包含的控件float屬性為真就是絕對(duì)布局,為假就是相對(duì)布局。不要小看這一個(gè)屬性,他帶來(lái)的效果可以天壤之別!給控件的float屬性設(shè)為真后,就使用了絕對(duì)布局,故名意思,絕對(duì)布局就是讓控件的坐標(biāo)絕對(duì)化,這樣這個(gè)控件就不受他的容器的束縛而可以自己隨意設(shè)置自己的位置!比如在橫縱向布局中給他們包含的子控件設(shè)置float屬性,這個(gè)控件就不會(huì)被自動(dòng)橫縱向排列。而我的建議是,能不用絕對(duì)布局就別用絕對(duì)布局!原因有三個(gè): 1)絕對(duì)布局破壞了各個(gè)容器的特性,而不受容器的束縛2)絕對(duì)布局讓控件的坐標(biāo)固定,不利于控件自動(dòng)調(diào)節(jié)位置3)后面提到的相對(duì)布局幾乎可以完成絕對(duì)布局的所有特性那么為什么要用絕對(duì)布局,因?yàn)樗囊粋€(gè)功能是相對(duì)布局無(wú)法完成的,就是讓控件或者布局重疊或者相交!有的時(shí)候我們必須這樣做來(lái)讓控件組合起來(lái)達(dá)到一些效果。我可以明確的說(shuō),我在做仿酷狗播放器的過(guò)程中,整個(gè)xml布局代碼只用了2個(gè)絕對(duì)布局,一個(gè)是編寫(xiě)搜索欄《仿酷狗音樂(lè)播放器開(kāi)發(fā)日志二——搜索欄的編寫(xiě)》,一個(gè)是編寫(xiě)電臺(tái)控件雖然不建議使用,但我也得說(shuō)一下絕對(duì)布局相關(guān)的屬性和使用技巧1)把float屬性設(shè)置為真2)設(shè)置pos屬性,這個(gè)屬性在float為真時(shí)才有效,他包含四個(gè)字段,分別以為了控件的左上右下下個(gè)坐標(biāo)的位置,但是建議只指定前兩個(gè)字段來(lái)設(shè)置控件的左上角的坐標(biāo),控件的寬度用width和height屬性來(lái)控制,這樣做的好處是避免了計(jì)算右下角坐標(biāo)的繁瑣!以后修改的時(shí)候也很清晰!用了這個(gè)屬性,就可以讓控件擁有相對(duì)布局的一部分特性,那就是根據(jù)容器的大小,自己可以調(diào)整位置和大?。∵@個(gè)特點(diǎn)我在《仿酷狗音樂(lè)播放器開(kāi)發(fā)日志二——搜索欄的編寫(xiě)》用到了,是為了讓搜索按鈕可以自己移動(dòng)。這個(gè)屬性的前兩個(gè)字段表示橫縱向的位移值,后兩個(gè)字段表示縮放值,具體效果大家應(yīng)該自己實(shí)踐一下!另外這個(gè)屬性默認(rèn)是有嚴(yán)重bug的,就是窗體最小化再恢復(fù)后有這個(gè)屬性的控件會(huì)自動(dòng)無(wú)規(guī)律偏移,這個(gè)bug我修復(fù)了,詳見(jiàn)《仿酷狗音樂(lè)播放器開(kāi)發(fā)日志二——搜索欄的編寫(xiě)》這樣就介紹完了絕對(duì)布局,然后就是整片文章的最重要部分,相對(duì)布局!在容器內(nèi)部使用控件或者容器時(shí),float屬性設(shè)置為flase(duilib默認(rèn)為false)就是相對(duì)布局了。這是我非常推薦使用的,前面我也說(shuō)了我在寫(xiě)仿酷狗的整個(gè)布局中,上百個(gè)控件中我只給兩個(gè)控件使用了絕對(duì)布局,其余都是相對(duì)布局。他的優(yōu)點(diǎn)如下: 1)布局和控件是可以根據(jù)窗體的大小改變而自動(dòng)調(diào)整位置的,這點(diǎn)很重要 2)不需要絕對(duì)布局那樣麻煩的計(jì)算各個(gè)控件的位置 3)在容器中調(diào)整前一個(gè)控件的位置,淘票票新春電影嘉年華開(kāi)啟,后面的控件都會(huì)自動(dòng)調(diào)整坐標(biāo)其實(shí)總得來(lái)說(shuō)使用相對(duì)布局意義就是使用布局控件的自動(dòng)排列特性!使用了相對(duì)布局后,就不用設(shè)置float屬性和pos屬性,一般只設(shè)置甚至不設(shè)置width和height屬性。這點(diǎn)很重要,如果你的控件或者布局的大小是固定的,那么就設(shè)置width和height屬性,如果想讓控件或者布局根據(jù)窗體的大小而自動(dòng)調(diào)整大小和位置,就不設(shè)置這兩個(gè)屬性。如果只設(shè)置了一個(gè)屬性,比如width設(shè)置為100,影視視頻制作而height不設(shè)置,那么他的高度是自動(dòng)調(diào)整的而寬度是固定的。父容器會(huì)自動(dòng)安排他包含的元素,讓含有width和height屬性的控件占據(jù)相應(yīng)的大小,把剩下的空間都分配給沒(méi)有設(shè)置wieth和height屬性的容器或者控件里??聪旅嬉粋€(gè)例子:這個(gè)例子是我的仿酷狗播放器的換膚窗體的標(biāo)題欄。他的外層是一個(gè)橫向布局,公司宣傳片拍攝高度為30,寬度隨窗體調(diào)整。讓標(biāo)題文字居于左側(cè),關(guān)閉按鈕在最右側(cè),如果讓窗體調(diào)整寬度后文字和關(guān)閉按鈕自動(dòng)調(diào)整位置,就需要把中間的空位占滿。這時(shí)我們就需要一個(gè)占位控件,不給他設(shè)置width和height屬性,這樣子他就會(huì)自動(dòng)占據(jù)剩余的空間!就達(dá)到了相對(duì)布局的自動(dòng)調(diào)整位置的效果。這個(gè)使用方法是相對(duì)布局里非常常用的!而這個(gè)占位控件在沒(méi)有什么其他要求時(shí)建議像我給出的例子那樣,使用Control控件,公司宣傳片拍攝因?yàn)樗撬锌丶腿萜鞯淖嫦然?,代碼和屬性相對(duì)是最少的,這樣有利于提高程序的效率!在充分理解了占位的技巧后,再配合一些微調(diào)屬性,就可以完美控制各個(gè)控件了,這幾個(gè)微調(diào)屬性分別是inset、padding、childpadding,這幾個(gè)屬性的介紹如下: