本章主要介紹了一些進(jìn)階的界面設(shè)計(jì)知識(shí)就谜,以及如何用圖形化界面設(shè)計(jì) UI (雖然不推薦日常使用,但是至少要知道肋联,特別是在 Android Studio 2.2 推出之后腰懂,可以直接查看設(shè)計(jì)藍(lán)圖,更為直觀并且容易調(diào)整細(xì)節(jié))隅津。
GitHub 地址:
完成第八章诬垂,未完成挑戰(zhàn)
完成第八章的挑戰(zhàn)
1. 樣式(style) 與 主題(theme)
為什么我們需要樣式(style)? 因?yàn)楫?dāng)界面有統(tǒng)一風(fēng)格時(shí)伦仍,就不需要針對(duì)每一個(gè)控件單獨(dú)寫(xiě)屬性了结窘,規(guī)定幾種樣式(style)即可。
style 是 XML 資源文件充蓝,含有用來(lái)描述組件行為和外觀的屬性定義隧枫。例如,下面的樣式能讓其顯示的文字大小大于一般的值谓苟。
<style name="BigTextStyle">
<item name="android:textSize">20sp</item>
<item name="android:padding">3dp</item>
</style>
我們可以在 res/values/ 目錄下的樣式文件中寫(xiě)入自己需要的屬性定義官脓,然后再布局文件中以 @style/my_own_style(file name)
的形式引用
什么是主題(theme)呢?主題是各種樣式的集合涝焙,從結(jié)構(gòu)上來(lái)說(shuō)卑笨,主體本身也是一種樣式資源,不過(guò)它的屬性指向了其他樣式資源
主題屬性引用 顧名思義就是將預(yù)定義的應(yīng)用主題樣式添加給指定組件纱皆,比如給 TextView 控件定義下面的屬性:
<style="?android:listSeparatorTextViewStyle">
意味著告訴 Android 運(yùn)行資源管理器:“在應(yīng)用主題里找到名為 listSeparatorTextViewStyle 的屬性湾趾。該屬性指向其他樣式資源芭商,請(qǐng)將其資源的值放在這里派草。”
2. margin 與 padding
Android 布局文件中的 margin 和 padding 跟 Web 編程的一樣铛楣,具體定義如下:
- margin 指的是外邊距近迁,即指定視圖組件之間的距離
- padding 指的是內(nèi)邊距,即指定視圖外邊框與其內(nèi)容間的距離
兩者之間區(qū)別如下圖:
3. dp簸州、sp 及屏幕像素密度
Android 使用密度修飾 drawable 目錄(如 drawable-xhdpi)下的圖像文件會(huì)自動(dòng)適配不同像素密度的屏幕鉴竭。那么問(wèn)題來(lái)了歧譬,加入圖像完成了自動(dòng)適配,但是邊距無(wú)法縮放適配搏存,或者用戶配置了大于默認(rèn)值的文字大小瑰步,會(huì)出現(xiàn)什么意外呢?
為了解決這些可能的問(wèn)題璧眠,Android 提供了密度無(wú)關(guān)的尺寸單位(density-independent dimension unit)缩焦。使用這種單位,可在不同屏幕密度的設(shè)備上獲得同樣的尺寸责静。無(wú)需進(jìn)行麻煩的轉(zhuǎn)換計(jì)算袁滥,應(yīng)用運(yùn)行時(shí),Android 會(huì)自動(dòng)將這種單位轉(zhuǎn)換成像素單位灾螃。
1. dp (dip, density-independent pixel) 密度無(wú)關(guān)像素
所謂密度無(wú)關(guān)题翻,即和屏幕的像素密度沒(méi)有關(guān)系。1dp 單位在設(shè)備的屏幕上總是等于 1/160 英寸腰鬼。使用 dp 的好處是嵌赠,無(wú)論屏幕密度如何,總能獲得同樣的尺寸熄赡。
px = dp * (dpi / 160)
其中猾普,dpi 即等于我們常說(shuō)的 ppi,計(jì)算公式即為
ppi = sqrt(屏幕橫向像素?cái)?shù)的平方 + 屏幕縱向像素?cái)?shù)的平方)/ 屏幕對(duì)角線英寸數(shù)
那么常見(jiàn)的 mdpi本谜, hdpi 是什么呢初家?對(duì)應(yīng)關(guān)系如下圖:
也就是說(shuō) 160ppi 像素密度的屏幕,又叫 mdpi 的屏幕乌助,程序中寫(xiě)的 1dp 在上面呈現(xiàn)的就是 1 像素(pixel溜在,px)。
2. sp (scale-independent pixel) 縮放無(wú)關(guān)像素
這種像素也與屏幕無(wú)關(guān)他托,但是與設(shè)置有關(guān)掖肋,一般用來(lái)設(shè)置文本的大小。
4. android:layout_weight 屬性
在 LinearLayout 中赏参,有這樣一個(gè)特殊屬性志笼,它能讓你自由分配擺放部件后的空間,避免大量留白把篓。它就是 android:layout_weight纫溃,這里的 weight 是權(quán)重的意思,也就是說(shuō)韧掩,每個(gè)部件都有自己的權(quán)重紊浩,用于分配擺放部件后剩余的空間。也就是說(shuō),如果兩個(gè)部件權(quán)重都是 1 時(shí)坊谁,它們平分?jǐn)[放它們之后的剩余空間费彼。
但是這樣就會(huì)出現(xiàn)一個(gè)問(wèn)題,由于分配的是剩余的空間口芍,所以在兩個(gè)部件 layout_width 屬性不一致(wrap_content 不算一致)時(shí)箍铲,layout_weight 屬性不能使部件平分整塊屏幕。如果想要平分怎么辦呢鬓椭?把兩個(gè)部件的 layout_width 都設(shè)為 0dp 再保持其 weight 相等虹钮,也就是把整塊屏幕都當(dāng)做剩余空間,就能平分整塊屏幕了膘融。
5. 挑戰(zhàn)練習(xí):日期格式化
我使用的是 SimpleDateFormat 類(lèi)芙粱,它能通過(guò)字符串來(lái)直接格式化 Date 類(lèi)型的數(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
簡(jiǎn)書(shū):http://www.reibang.com/u/723da691aa42