Android常用布局(FrameLayout、LinearLayout、RelativeLayout)詳解
很多開(kāi)發(fā)者一聽(tīng)說(shuō)Android終端的屏幕尺寸五花八門(mén),屏幕分辨率千奇百怪,就覺(jué)得Android開(kāi)發(fā)在屏幕適配方面是必定是一件頭疼的事情。因?yàn)樵贏ndroid問(wèn)世之前,廣大開(kāi)發(fā)者知道的UI解決方案大致分為兩類(lèi):
1、在Web開(kāi)發(fā)中的CSS,一層一層的去層疊樣式。
2、在iOS開(kāi)發(fā)中去計(jì)算每一個(gè)UIView的尺寸。
上面兩種方案,無(wú)論哪種方案面對(duì)碎片化嚴(yán)重的Android終端,那都是一場(chǎng)噩夢(mèng)。好在Android提供了另一套解決方案來(lái)應(yīng)對(duì)嚴(yán)重的終端碎片化,這就是布局和9-patch。
這里想來(lái)說(shuō)說(shuō)布局,在Android SDK剛剛問(wèn)世的時(shí)候,Android提供了AbsoluteLayout,F(xiàn)rameLayout,LinearLayout,RelativeLayout和Tablelayout五大布局來(lái)應(yīng)對(duì)終端碎片化問(wèn)題。
但很快Android發(fā)現(xiàn)AbsoluteLayout是一個(gè)愚蠢的方案,在Android 1.5系統(tǒng)中就不再支持此布局,剩下的四個(gè)布局中,Tablelayout雖然依然被支持,但是由于Fragment以及新的TabLayout的出現(xiàn),博主在此斷言,Tablelayout也命不久矣,被移除支持只是遲早的事兒。
所以,Android的五大基本布局現(xiàn)在只剩下三個(gè)(這里說(shuō)的是基本布局,在Android support包里引入的新的布局不計(jì)入內(nèi)),下面分別介紹一下這三個(gè)基本布局。
一、FrameLayout
FrameLayout應(yīng)該是Android系統(tǒng)中最簡(jiǎn)單的布局了,在FrameLayout中的元素,默認(rèn)都是以FrameLayout控件的坐上頂點(diǎn)作為基準(zhǔn)點(diǎn),一層一層的重疊起來(lái),后加進(jìn)來(lái)的元素覆蓋前面的元素。
下面先來(lái)一個(gè)演示,代碼如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:layout_width="200dp" android:layout_height="200dp" android:background="#ff0000"/> <View android:layout_width="200dp" android:layout_height="200dp" android:background="#000000"/> <View android:layout_width="200dp" android:layout_height="200dp" android:layout_margin="100dp" android:background="#00ff00"/> </FrameLayout>
運(yùn)行結(jié)果如下:
在代碼里,有三個(gè)View,而在運(yùn)行結(jié)果上只能看到兩個(gè)View,一個(gè)黑色和一個(gè)綠色。這是因?yàn)榧t色的View被黑色的View蓋住了。
在FrameLayout中,通過(guò)android:layout_gravity屬性去指定子元素的位置,下面調(diào)整一下上訴例子中的黑色View的位置,讓紅色的View顯示出來(lái),調(diào)整后的代碼如下:
<View android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="bottom|right" android:background="#000000"/>
可以看到上面代碼里添加了android:layout_gravity屬性,并且指定了兩個(gè)值,一個(gè)為bottom,一個(gè)為right,表示這個(gè)View將被放到FrameLayout的右下角。運(yùn)行結(jié)果如下圖所示:
二、LinearLayout
LinearLayout是線(xiàn)性布局,它可以讓它內(nèi)部的元素按照指定方向依次排開(kāi)。LinearLayout的方向是通過(guò)android:orientation屬性指定,并且可以通過(guò)android:gravity屬性指定對(duì)其方式。
還是直接上段代碼看看效果,代碼如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <View android:layout_width="100dp" android:layout_height="100dp" android:background="#ff0000"/> <View android:layout_width="100dp" android:layout_height="100dp" android:background="#000000"/> <View android:layout_width="100dp" android:layout_height="100dp" android:background="#00ff00"/> </LinearLayout>
在代碼中,設(shè)置了LinearLayout的方向?yàn)榭v向,并且對(duì)其方式居中對(duì)齊,于是運(yùn)行結(jié)果如下圖所示:
除了android:orientation將設(shè)為vertical外,也可以設(shè)為horizontal。讓LinearLayout內(nèi)部的元素橫向排列,將上面例子中的android:orientation屬性值改為horizontal后的運(yùn)行結(jié)果,如下圖所示:
三、RelativeLayout
RelativeLayout是基本布局里面最靈活,也是最復(fù)雜的布局,它內(nèi)部的元素可以通過(guò)設(shè)定彼此之間的相對(duì)關(guān)系來(lái)決定布局,使用RelativeLayout時(shí),推薦為其內(nèi)部每個(gè)元素都設(shè)定id,下面依然通過(guò)一個(gè)列子來(lái)演示此布局的使用方法。代碼如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/red" android:layout_width="100dp" android:layout_height="100dp" android:background="#ff0000"/> <View android:id="@+id/black" android:layout_width="100dp" android:layout_height="100dp" android:layout_toRightOf="@id/red" android:layout_below="@id/red" android:background="#000000"/> <View android:id="@+id/green" android:layout_width="100dp" android:layout_height="100dp" android:layout_below="@id/black" android:layout_alignParentRight="true" android:background="#00ff00"/> <View android:id="@+id/gray" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" android:background="#888888"/> <View android:id="@+id/orange" android:layout_width="100dp" android:layout_height="100dp" android:layout_toRightOf="@id/green" android:layout_below="@id/gray" android:background="#ff8800"/> </RelativeLayout>
先分析代碼,可以看到每一個(gè)View都被設(shè)置了一個(gè)id值,分別為red,black,green,gray和orange。然后通過(guò)代碼,可以看出black位于red的右邊和下面,green位于black的下面并且右對(duì)齊其父元素(即RelativeLayout),gray居中對(duì)齊父元素(即RelativeLayout), orange位于green的右邊同時(shí)位于gray的下面,運(yùn)行結(jié)果如圖所示:
在此在歸納一下RelativeLayout中,與布局相關(guān)的屬性:
android:layout_below:位于指定元素的下方
android:layout_above:位于指定元素的上方
android:layout_toLeftOf:位于指定元素的左側(cè)
android:layout_toRightOf:位于指定元素的右側(cè)
android:layout_centerVertical:垂直居中對(duì)齊父元素
android:layout_centerHorizontal:水平居中對(duì)齊父元素
android:layout_centerInParent:居中對(duì)齊父元素
android:layout_alignParentRight:與父元素右對(duì)齊
android:layout_alignParentLeft:與父元素左對(duì)齊
android:layout_alignParentTop:與父元素上對(duì)齊
android:layout_alignParentBottom:與父元素下對(duì)齊
android:layout_alignRight:與指定元素右對(duì)齊
android:layout_alignLeft:與指定元素左對(duì)齊
android:layout_alignTop:與指定元素上對(duì)齊
android:layout_alignBottom:與指定元素下對(duì)齊
從Android 4.2開(kāi)始,也就是從API Level 17開(kāi)始,Android增強(qiáng)了RelativeLayout,使其能夠更好的應(yīng)對(duì)并本地化這一需求,比如在有的國(guó)家,文字是從右往左閱讀,這也就是所說(shuō)的RTL。為了應(yīng)對(duì)RTL,RelativeLayout又增加了以下屬性:
android:layout_alignStart:與指定元素的開(kāi)始位置對(duì)齊
android:layout_toStartOf:位于指定元素的開(kāi)始側(cè)
android:layout_alignParentStart:與父元素與開(kāi)始側(cè)對(duì)齊
android:layout_alignEnd:與指定元素的結(jié)束始位置對(duì)齊
android:layout_toEndOf:位于指定元素的結(jié)束側(cè)
android:layout_alignParentEnd:與指定元素的結(jié)束位置對(duì)齊
這里的開(kāi)始和結(jié)束我們可以做如下理解:
開(kāi)始:在從左到右閱讀習(xí)慣的國(guó)家,開(kāi)始側(cè)等于左側(cè),toStartOf的顯示效果就等于toLeftOf。但是在從右往左閱讀習(xí)慣的國(guó)家,那么開(kāi)始側(cè)就變成了右側(cè),toStartOf的顯示效果就等于了toRightOf。
結(jié)束:同上面對(duì)開(kāi)始的理解一樣,結(jié)束側(cè)在從左到右閱讀習(xí)慣的國(guó)家就是右側(cè),反之則在左側(cè)。
原文鏈接:http://lyjbk.com/archives/158.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
自定義ListView實(shí)現(xiàn)拖拽ListItem項(xiàng)交換位置(附源碼)
本文要實(shí)現(xiàn)的是拖拽ListView的Item項(xiàng),在布局方面還是用基于布局泵LayoutInflater來(lái)從不同的Layout模板拿到不同的布局然后將view返回,感興趣的朋友可以了解下哈2013-06-06Kotlin類(lèi)與屬性及構(gòu)造函數(shù)的使用詳解
這篇文章主要介紹了Kotlin語(yǔ)言中類(lèi)與屬性及構(gòu)造函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09Ubuntu中為Android系統(tǒng)上編寫(xiě)Linux內(nèi)核驅(qū)動(dòng)程序?qū)崿F(xiàn)方法
本文主要介紹在Ubuntu 上為Android系統(tǒng)編寫(xiě)Linux內(nèi)核驅(qū)動(dòng)程序, 這里對(duì)編寫(xiě)驅(qū)動(dòng)程序做了詳細(xì)的說(shuō)明,對(duì)研究Android源碼和HAL都有巨大的幫助,有需要的小伙伴可以參考下2016-08-08Android開(kāi)發(fā)之文本內(nèi)容自動(dòng)朗讀功能實(shí)現(xiàn)方法
這篇文章主要介紹了Android開(kāi)發(fā)之文本內(nèi)容自動(dòng)朗讀功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android自動(dòng)朗讀TTS功能的操作步驟、相關(guān)函數(shù)使用方法與注意事項(xiàng),需要的朋友可以參考下2017-09-09Android自定義View實(shí)現(xiàn)葉子飄動(dòng)旋轉(zhuǎn)效果(四)
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)葉子飄動(dòng)旋轉(zhuǎn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03android 仿微信demo——登錄功能實(shí)現(xiàn)(服務(wù)端)
這系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗?,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你們提供幫助2021-06-06Android Studio編寫(xiě)AIDL文件后如何實(shí)現(xiàn)自動(dòng)編譯生成
這篇文章主要介紹了Android Studio編寫(xiě)AIDL文件后如何實(shí)現(xiàn)自動(dòng)編譯生成,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03android ContentResolver獲取手機(jī)電話(huà)號(hào)碼和短信內(nèi)容
這篇文章主要為大家詳細(xì)介紹了android ContentResolver獲取手機(jī)電話(huà)號(hào)碼、短信內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android Studio實(shí)現(xiàn)仿微信APP門(mén)戶(hù)界面詳解及源碼
這篇文章帶你通過(guò)Android studio來(lái)實(shí)現(xiàn)微信APP的門(mén)戶(hù)界面,主要說(shuō)明框架的各部分功能與實(shí)現(xiàn)過(guò)程,下文包含了整個(gè)開(kāi)發(fā)過(guò)程,以及解決問(wèn)題的思路并再末尾提供了源碼鏈接2021-10-10