絕對布局 AbsoluteLayout
本節(jié)將介紹 Android 原生布局的最后一個布局,也是最不常用的布局——絕對布局(AbsoluteLayout)。目前在 Android SDK 中處于被棄用的狀態(tài),原因是前面學(xué)習(xí)過的 5 大布局太過強(qiáng)大。確實,絕對布局在開發(fā)中中可能從來都用不到,但是我們作為學(xué)習(xí)過慕課教程的高級玩家,需要一方面擴(kuò)展自己的知識面,另一方面需要學(xué)習(xí)絕對布局的設(shè)計思想及設(shè)計理念,這對我們今后的學(xué)習(xí)都是有益無害的。
1. 絕對布局的特性
顧名思義,絕對布局就是可以設(shè)置布局內(nèi) View 及 ViewGroup 所在的絕對位置。從名字上聽起來它和相對布局(RelativeLayout)相反,所以這里我們還是用相對布局那一節(jié)(第8節(jié))所提到的例子舉例。
如果你想布置你的客廳,你可以將所有的家具都標(biāo)上位置,比如空調(diào)在右上角、沙發(fā)靠下方墻面、茶幾在中間靠下、電視機(jī)靠上方墻面等等。那么客廳就是你的 AbsoluteLayout,空調(diào)、沙發(fā)、茶幾、電視等就是 View,然后我們給每個 View 設(shè)置一個坐標(biāo),這樣一來就可以按照我們的要求布置客廳了。
AbsoluteLayout 的工作原理就是這么簡單,如下圖所示,直接對他的子 View 設(shè)置 X / Y 坐標(biāo),然后 Android 系統(tǒng)就會幫我們將各個 View 擺放到相應(yīng)的位置。AbsoluteLayout 比較直觀,但是也非常不靈活,兼容性差?,F(xiàn)在 Android 系統(tǒng)的機(jī)型千奇百怪,難以通過一套坐標(biāo)系就能適配到各個不同尺寸的手機(jī)上,就好像如果直接把別人的客廳家具擺放坐標(biāo)照搬到自己家,很可能會擺出各種奇葩的設(shè)計,這也是 AbsoluteLayout 最大的一個缺陷。
2. 絕對布局的屬性
AbsoluteLayout 的屬性非常簡單,從上面的了解你應(yīng)該也能猜出一二:
- android:id:
唯一標(biāo)識當(dāng)前 View 的 id - android:layout_x:
設(shè)置 View 的橫坐標(biāo) - android:layout_y:
設(shè)置 View 的縱坐標(biāo)
需要注意的是,這里所設(shè)置的橫縱坐標(biāo)均是 View 左上角的坐標(biāo),不是中心點
3. AbsoluteLayout 例子
大家還記得第 10 節(jié)中,我們通過 GridLayout 實現(xiàn)了一個登陸頁面嗎?這一節(jié)我們用 AbsoluteLayout 來實現(xiàn)一個簡單的登陸頁面。
首先我們需要一個 TextView 作為“賬號”提示文案、一個 TextView 作為“密碼”提示文案,再加兩個 EditText 作為輸入框,然后還有一個確認(rèn)按鍵。最后在添加之后我們對每個 View 設(shè)置一個坐標(biāo)即可,代碼如下:
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="38dp"
android:layout_y="38dp"
android:text="賬號" />
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_x="131dp"
android:layout_y="17dp"
android:width="33dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="38dp"
android:layout_y="66dp"
android:text="密碼" />
<EditText
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_x="131dp"
android:layout_y="40dp"
android:width="33dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="39dp"
android:layout_y="109dp"
android:text="確認(rèn)" />
</AbsoluteLayout>
最后的運(yùn)行效果:
也許在我的這個設(shè)備上運(yùn)行效果還行,你可以直接拷貝代碼到自己的設(shè)備或者虛擬機(jī)上運(yùn)行,會發(fā)現(xiàn)在不同尺寸的手機(jī)上效果差異會很大。極端情況如果你的屏幕更寬、或者干脆就是一臺平板,那么我們的內(nèi)容會全部集中在左側(cè),視覺效果就很差。
4. 小結(jié)
到這里,首先要恭喜你已經(jīng)學(xué)完了 Android 所有的原生布局,對于 AbsoluteLayout 我們只需要了解,在未來的開發(fā)中并不推薦使用。更多的時候是采用 LinearLayout + RelativeLayout 來組合出不同的效果,主要借用 LinearLayout 的 weight 屬性幫我們完成比例適配,然后 RelativeLayout 的相對位置可以讓我們的布局更加靈活;
如果需要制作表格或者網(wǎng)格結(jié)果,那么 TableLayout / GridLayout 是當(dāng)之無愧最佳之選;最后幀布局擁有強(qiáng)大的性能優(yōu)勢,很適合作為一個復(fù)雜布局的 root 布局,在能夠使用的時候更推薦使用 FrameLayout。
Layout 的存在就是為了對 View 進(jìn)行布局?jǐn)[放,那么接下來的教程就開始進(jìn)入 View 的講解。