在Android開發(fā)的絕大部分場(chǎng)景里,我們都需要構(gòu)建至少一個(gè)以上的UI界面用于與user的交互。UI界面本身其實(shí)只是靜態(tài)的圖片或者框架,但是通過(guò)對(duì)其的控制,可以實(shí)現(xiàn)幾乎所有的用戶使用效果,例如點(diǎn)擊后高亮,點(diǎn)擊后消失,左劃刪除單個(gè)條目等等。那么今天就來(lái)看看Android中關(guān)于UI布局的一些概念和知識(shí)。
一、LinearLayout VS RelativeLayout VS FrameLayout VS ConstraintLayout
在Android開發(fā)環(huán)境中,一個(gè)UI layout布局頁(yè)面以xml文件的格式存于:你的工程路徑/main/res/layout里面。xml文件的具體格式這里不再贅述,但是要具體對(duì)于不同種類的Layout稍微解釋一下:
第一種是LinearLayout,這種布局一般來(lái)說(shuō)是最簡(jiǎn)單,直接,快速的一種,當(dāng)新建一個(gè)layout布局文件時(shí),Android Studio默認(rèn)的布局文件即為這種LinearLayout。顧名思義,這種布局最適用于線性的UI呈現(xiàn)方式,比如如下的布局:

對(duì)于這種只需要橫向(Horizontal)或縱向(Vertical)排列的布局,LinearLayout可以說(shuō)是最適合不過(guò)的選擇了,它減少了很多處理各部件之前位置關(guān)系的參數(shù)聲明,只需按需調(diào)整當(dāng)前部件和上一個(gè)部件之間的位置關(guān)系,直到完成布局即可。簡(jiǎn)單來(lái)說(shuō),LinearLayout就像堆積木,你只需要沿某一個(gè)方向不斷堆砌你的subview,并給每個(gè)subview規(guī)定好邊距等參數(shù)即可。
第二種是relativeLayout,這種布局的特點(diǎn)在于:各部件之間的位置關(guān)系主要靠定義與其同布局的其他部件(Sibling)的位置關(guān)系來(lái)決定。比如我們?cè)诙x下面這樣一個(gè)頁(yè)面:

類似如上的界面 一般會(huì)出現(xiàn)在列表的界面中,對(duì)于這種布局我們希望view 1和view 3的左邊界對(duì)齊,而view 2和view 3的右邊界對(duì)齊。至于整體布局的高度我們并不是十分介意(一般這種布局會(huì)采用上滑顯示更多的RecyclerListView,這個(gè)以后會(huì)繼續(xù)講到)。所以此時(shí)RelativeLayout就可以通過(guò)聲明?android:layout_toLeftOf?以及?android:layout_toRightOf?來(lái)限制組件間位置關(guān)系,從而達(dá)到我們想要的效果。RelativeLayout在定義同一塊subview內(nèi)的不同組件間位置關(guān)系時(shí)非常有效,但是問題是需要處理好位置關(guān)系間的沖突,一般需要花費(fèi)比較多的時(shí)間用于調(diào)整相對(duì)的位置關(guān)系。這種布局的使用方法更靈活,能較快速地完成一些更為復(fù)雜的布局關(guān)系。
第三種是FrameLayout,這種布局一般應(yīng)用于多層嵌套的視圖布局。其實(shí)上面介紹的兩種視圖也可以用于層疊(Overlap)效果,對(duì)于到底使用哪種布局在一些特定的應(yīng)用場(chǎng)景下也會(huì)有所不同。但我的理解是: FrameLayout對(duì)于層疊場(chǎng)景會(huì)有更好的表現(xiàn)和處理方式,在FrameLayout中也會(huì)有更多不同的聲明方式來(lái)進(jìn)行布局,而一般的RelativeLayout來(lái)定義層疊的位置關(guān)系會(huì)變得很復(fù)雜。所以不妨分離出所設(shè)計(jì)的頁(yè)面中的層疊部分,來(lái)用FrameLayout完成,而其他的部分則采用RelativeLayout。

將你的頁(yè)面進(jìn)行分離,使用不同的UI布局框架來(lái)定義不同的子頁(yè)面,也是UI設(shè)計(jì)布局中十分重要的一步。決定好使用的框架會(huì)讓你的UI設(shè)計(jì)變得簡(jiǎn)單易懂,并且易于改動(dòng)。相信很多人都遇到過(guò)改UI的時(shí)候一改就要?jiǎng)拥剿械目蚣苓@種十分痛苦的事情。
最后一個(gè),也是我認(rèn)為最為重要,功能最為強(qiáng)大的一個(gè),就是ConstraintLayout。ConstraintLayout和其它布局方式最明顯的區(qū)別在于,它需要對(duì)于每一個(gè)組件聲明布局的constraint,而這些constraint必須聲明得比較完備,才能獲得想要呈現(xiàn)的效果(也正是因?yàn)樾枰暶鞯腸onstraint比較多,所以ConstraintLayout可以比較好的大部分在App中我們想要呈現(xiàn)的布局效果)。

在ConstraintLayout中,當(dāng)定義一個(gè)組件的時(shí)候,可以通過(guò)聲明“app:layout_constraintXX_toXXOf”來(lái)定義其相對(duì)于另一個(gè)組建的位置,同時(shí)也可以通過(guò)聲明“android:layout_marginXX”來(lái)定義其相對(duì)邊距,其用法是十分靈活的。ConstranitLayout在進(jìn)行諸如邊緣對(duì)齊,居中,各子視圖(subview)平均分配等功能時(shí)十分有效,目前可以說(shuō)是我最喜歡使用,也最經(jīng)常使用的一種布局框架。
以上這四種就是UI布局中最常見的Layou,熟悉了解這四種框架之后,通過(guò)嵌套<include>的方式可以構(gòu)造出目前Android應(yīng)用的絕大部分UI場(chǎng)景和內(nèi)容,讓我們一起慢慢掌握。