FrameLayout 應該說是 Android 常用UI布局里面最簡單的一種,顧名思義,它的布局方式就是將 View 一幀一幀的疊加到一起,有點類似 Photoshop 里面的圖層的概念。在學習 FrameLayout 的過程中,你會發(fā)現(xiàn)基于它可以設計出很多有意思的 Android UI。那么接下來,我們來一起一探究竟。
1. FrameLayout 的特性
FrameLayout 是最簡單且最高效的布局形式,不過 FrameLayout 的使用頻率相比其他的 Layout 來講要更少很多,主要是因為很多時候它只是作為一個容器來顯示單個 View 或者多個 View 重疊的場景。
用過 Photoshop 的朋友對“圖層”的概念應該比較熟悉,我們可以插入很多個圖層,后添加的圖層會擋住先添加的圖層,然后針對每個圖層我們可以任意的設置它在整個圖片中的位置。同樣的,我們可以設置 FrameLayout 內部 View 所處的位置,與 RelativeLayout 相似,可以設置放置在上下左右,同樣也可以設置邊距。如果放置了多個 View,那么他們會按照放置的順序依次疊加,后加入 View 的會擋住前面加入的 View。
2. FrameLayout 的常用設置
在第 1 小節(jié)我們提到過,F(xiàn)rameLayout 可以設置內部 View 所在的位置,那么這幾個屬性和 RelativeLayout 一樣,這里不再重復,主要介紹一下 FrameLayout 特有又常用的兩個屬性:android:foreground
和android:foregroundGravity
。
2.1 前景圖像
android:foreground: 設置 FrameLayout 的前景圖像
前景圖像會置于 FrameLayout 內部所有 View 的層級之上,直接設置圖片的資源 id 即可,如下:
android:foreground="@drawable/emercy"
2.2 前景位置
android:foregroundGravity: 設置 FrameLayout 前景圖片的擺放位置,設置方式與 RelativeLayout 中的 View 一樣,如:
android:foregroundGravity="bottom|right"
3. 通過 XML 完成一個 FrameLayout
我們的 FrameLayout 需要滿足以下要求:
- 一個圖片,作為 FrameLayout 的前景;
- 一個 Android Logo 圖片資源(ImageView);
- 一個文本資源,和 Logo 重疊,可以看到后添加的 View 會擋住前面添加的 View;
- 一個文本資源,和前景圖片重疊,可以看到前景圖片時鐘會在內部 View 之上顯示。
完成以上功能的布局代碼比較簡單:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@drawable/emercy"
android:foregroundGravity="bottom|right"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:src="@mipmap/ic_launcher" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:background="#4C374A"
android:padding="10dp"
android:text="Welcome to iMooc"
android:textColor="#FFFFFF"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|bottom"
android:background="#1E64D8"
android:padding="10dp"
android:text="Emercy Android"
android:textColor="#FFFFFF"
android:textSize="18sp" />
</FrameLayout>
效果如下:
這就是 FrameLayout 的基本用法。
4. FrameLayout 的適用場景
到這里,基本上你已經(jīng)掌握了 FrameLayout 的用法,可能你會有所疑惑,看起來 FrameLayout 也沒有什么特別好的地方,似乎完全可以被 RelativeLayout 替代,所以很多人在開發(fā)過程中,往往會忘記還有這么個 Layout。其實越是往后學你越會發(fā)現(xiàn),F(xiàn)rameLayout 的簡單不僅僅體現(xiàn)在使用上,更大的優(yōu)勢是在于其性能。當你的屏幕上控件不太多時,比如 Android 的桌面 Widget,或者 Home 應用,大多都是直接采用 FrameLayout 完成的布局。
事實上,還有一處是 FrameLayout 用的最多的地方,也是一個非常隱蔽的地方。如果我們打開 Hierarchy Viewer 或者類似的 View 分析工具,我們可以看到Android的每一個頁面都是在一個 FrameLayout 中完成的布局,也就是無論你定義的布局有多復雜,最終都會被放到一個 FrameLayout 當中顯示,這也體現(xiàn)了 FrameLayout 的強大,在今后的學習工作中,希望大家一定不要忽視了 FrameLayout,在此為大家埋下一個伏筆。
5. 小結
這里需要再次強調:FrameLayout 是最簡單,最高效的布局方式。它的布局方式很容易理解,我們通過它可以將內部的 View 防止到任意的方位,如果內部有多個 View,那么按照防止順序,后加入的View會擋住前面加入的 View。