Android編程權(quán)威指南(第二版)學習筆記(八)—— 第8章 使用布局與組件創(chuàng)建用戶界面

本章主要介紹了一些進階的界面設(shè)計知識,以及如何用圖形化界面設(shè)計 UI (雖然不推薦日常使用,但是至少要知道,特別是在 Android Studio 2.2 推出之后,可以直接查看設(shè)計藍圖,更為直觀并且容易調(diào)整細節(jié))。

GitHub 地址:
完成第八章,未完成挑戰(zhàn)
完成第八章的挑戰(zhàn)

1. 樣式(style) 與 主題(theme)

為什么我們需要樣式(style)? 因為當界面有統(tǒng)一風格時,就不需要針對每一個控件單獨寫屬性了,規(guī)定幾種樣式(style)即可。

style 是 XML 資源文件,含有用來描述組件行為和外觀的屬性定義。例如,下面的樣式能讓其顯示的文字大小大于一般的值。

<style name="BigTextStyle">
    <item name="android:textSize">20sp</item>
    <item name="android:padding">3dp</item>
</style>

我們可以在 res/values/ 目錄下的樣式文件中寫入自己需要的屬性定義,然后再布局文件中以 @style/my_own_style(file name) 的形式引用

什么是主題(theme)呢?主題是各種樣式的集合,從結(jié)構(gòu)上來說,主體本身也是一種樣式資源,不過它的屬性指向了其他樣式資源

主題屬性引用 顧名思義就是將預定義的應(yīng)用主題樣式添加給指定組件,比如給 TextView 控件定義下面的屬性:

<style="?android:listSeparatorTextViewStyle">

意味著告訴 Android 運行資源管理器:“在應(yīng)用主題里找到名為 listSeparatorTextViewStyle 的屬性。該屬性指向其他樣式資源,請將其資源的值放在這里。”

2. margin 與 padding

Android 布局文件中的 margin 和 padding 跟 Web 編程的一樣,具體定義如下:

  • margin 指的是外邊距,即指定視圖組件之間的距離
  • padding 指的是內(nèi)邊距,即指定視圖外邊框與其內(nèi)容間的距離

兩者之間區(qū)別如下圖:


margin 和 padding

3. dp、sp 及屏幕像素密度

Android 使用密度修飾 drawable 目錄(如 drawable-xhdpi)下的圖像文件會自動適配不同像素密度的屏幕。那么問題來了,加入圖像完成了自動適配,但是邊距無法縮放適配,或者用戶配置了大于默認值的文字大小,會出現(xiàn)什么意外呢?

為了解決這些可能的問題,Android 提供了密度無關(guān)的尺寸單位(density-independent dimension unit)。使用這種單位,可在不同屏幕密度的設(shè)備上獲得同樣的尺寸。無需進行麻煩的轉(zhuǎn)換計算,應(yīng)用運行時,Android 會自動將這種單位轉(zhuǎn)換成像素單位。

1. dp (dip, density-independent pixel) 密度無關(guān)像素

所謂密度無關(guān),即和屏幕的像素密度沒有關(guān)系。1dp 單位在設(shè)備的屏幕上總是等于 1/160 英寸。使用 dp 的好處是,無論屏幕密度如何,總能獲得同樣的尺寸。

px = dp * (dpi / 160)

其中,dpi 即等于我們常說的 ppi,計算公式即為

ppi = sqrt(屏幕橫向像素數(shù)的平方 + 屏幕縱向像素數(shù)的平方)/ 屏幕對角線英寸數(shù)

那么常見的 mdpi, hdpi 是什么呢?對應(yīng)關(guān)系如下圖:


ppi 對應(yīng)尺寸

也就是說 160ppi 像素密度的屏幕,又叫 mdpi 的屏幕,程序中寫的 1dp 在上面呈現(xiàn)的就是 1 像素(pixel,px)。

2. sp (scale-independent pixel) 縮放無關(guān)像素

這種像素也與屏幕無關(guān),但是與設(shè)置有關(guān),一般用來設(shè)置文本的大小。

4. android:layout_weight 屬性

在 LinearLayout 中,有這樣一個特殊屬性,它能讓你自由分配擺放部件后的空間,避免大量留白。它就是 android:layout_weight,這里的 weight 是權(quán)重的意思,也就是說,每個部件都有自己的權(quán)重,用于分配擺放部件后剩余的空間。也就是說,如果兩個部件權(quán)重都是 1 時,它們平分擺放它們之后的剩余空間。

但是這樣就會出現(xiàn)一個問題,由于分配的是剩余的空間,所以在兩個部件 layout_width 屬性不一致(wrap_content 不算一致)時,layout_weight 屬性不能使部件平分整塊屏幕。如果想要平分怎么辦呢?把兩個部件的 layout_width 都設(shè)為 0dp 再保持其 weight 相等,也就是把整塊屏幕都當做剩余空間,就能平分整塊屏幕了。

5. 挑戰(zhàn)練習:日期格式化

我使用的是 SimpleDateFormat 類,它能通過字符串來直接格式化 Date 類型的數(shù)據(jù)。

SimpleDateFormat sdf = new SimpleDateFormat("EEEE, MMM d, y", Locale.US);
mDateButton = (Button) v.findViewById(R.id.crime_date);      mDateButton.setText(sdf.format(mCrime.getDate()));

GitHub Page: kniost.github.io
簡書:http://www.itdecent.cn/u/723da691aa42

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容