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