Android編程權(quán)威指南(第二版)學(xué)習筆記(二十一)—— 第21章 XML drawable

本章介紹了常用的 XML drawable,包括 shape,state list 和 layer list。還介紹了 9-patch 圖片和 mipmap 目錄等知識。

GitHub 地址:
完成第21章

1. XML drawable

在 Android 世界里,凡是要在屏幕上繪制的東西都可以叫作 drawable,比如抽象圖形、 Drawable 類的子類、位圖圖像等。我們之前用來封裝圖片的 BitmapDrawable 就是一種 drawable。 本章我們使用的 drawable 都定義在 XML 文件中,可以歸為一類,統(tǒng)稱為 XML drawable。

1.1 為什么要使用 XML drawable

XML drawable 用起來方便靈活,不僅用法多樣,還易于更新維護。搭配使用 shape drawable
和 layer list drawable 可以做出復(fù)雜的背景圖,連圖像編輯器都省了。更改應(yīng)用的配色更是簡單,直接修改 XML drawable 中的顏色就行了。
另外,XML drawable 獨立于屏幕像素密度,它們直接定義在 drawable 目錄中,不需要加屏幕密度資源修飾符。如果是普通圖像,就需要準備多個版本,以適配不同屏幕像素密度的設(shè)備;而 XML drawable 只要定義一次,就能在任何設(shè)備的屏幕上表現(xiàn)出色。

1.2 shape drawable

一個常見的圓形 shape drawable 如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="oval">

    <solid
        android:color="@color/red"/>

    <stroke
        android:width="4dp"
        android:color="@color/dark_red"/>
</shape>

該 shape drawable 定義了一個帶有暗紅色圓環(huán)的填充紅色的橢圓。

  • shape 標簽中 android:shape 屬性定義了其形狀為橢圓(當然,如果需要是正圓,只需要把控件的高寬設(shè)為相等即可),還可以是長方形,線條,梯形等圖形;
  • solid 標簽定義填充,其中 android:color 定義其填充顏色(默認透明)
  • stroke 標簽定義邊框,屬性都類似
  • 還有更多標簽和屬性,可以在這里找到:shape drawable

1.3 state list drawable

為了在控件的不同狀態(tài)下切換不同的 drawable, 我們用到了 state list drawable,它會根據(jù)按鈕的狀態(tài)改變使用的 drawable,一個例子如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_beat_box_pressed"
          android:state_pressed="true"/>
    <item android:drawable="@drawable/button_beat_box_normal"/>
</selector>

將一個 drawable 資源文件定義為 selector,便是讓系統(tǒng)根據(jù)狀態(tài)選擇。狀態(tài)有按下,禁用,聚焦以及激活等狀態(tài),可以根據(jù)不同的狀態(tài)使用不同的 drawable。

還有更多標簽和屬性,可以在這里找到:state list drawable

1.4 layer list drawable

layer list 可以將多個 drawable 組成一個 drawable 并可以指定其擺放層次和位置,可以組成一些復(fù)雜的效果。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">

            <solid
                android:color="@color/red"/>

        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <stroke
                android:width="4dp"
                android:color="@color/dark_red"/>
        </shape>
    </item>
</layer-list>

這個 layer list 將一個矩形疊放在一個橢圓上。還有更多的屬性可以查看 layer list drawable

2. 9-patch 圖像(九宮格圖像)

有時候,按鈕背景圖必須用到普通圖片。那么,如果按鈕需要以不同尺寸顯示,背景圖該如何變化呢?如果按鈕的寬度大于背景圖的寬度,圖片會被拉伸。拉伸的圖片會有很好的效果嗎? 朝一個方向拉伸背景圖很可能會讓圖片失去原樣,所以得想個辦法控制圖片拉伸方式。

9-patch 就是這樣一種方式,它將圖像分成3×3的網(wǎng)格,即由9 patch 組成的網(wǎng)格。網(wǎng)格角落部分不會被縮放,邊緣部分的4個 patch 只按一個維度縮放,而中間部分則按兩個維度縮放,如下圖:

9-patch示意圖

9-patch 圖像和普通 PNG 圖像十分相似,只有兩處不同:9-patch 圖像文件名以.9.png 結(jié)尾,圖像邊緣具有1像素寬度的邊框。這個邊框用以指定9-patch 圖像的中間位置。邊框像素繪制為黑線, 以表明中間位置,邊緣部分則用透明色表示。

在 Android Studio 中,右鍵單擊想要轉(zhuǎn)換為 9-patch 的圖像文件選擇創(chuàng)建 9-patch 文件,然后雙擊打開,畫上黑邊即可。旁邊會顯示不同方向拉伸后的效果。

9-patch效果圖

3. mipmap 目錄

應(yīng)用要用到圖像,就一般會針對不同的設(shè)備尺寸準備不同尺寸的圖片,再分別放入 drawable-mdpi 和 drawable-hdpi 這樣的文件夾。然后,按名字引用它們。 剩下的就交給 Android 了,它會根據(jù)當前設(shè)備的屏幕密度調(diào)用相應(yīng)的圖片。
這樣就會存在一個問題:發(fā)布出去的 APK 文件包含了項目 drawable 目錄里的所有圖片,哪怕是從來不會用到的圖片,這會讓應(yīng)用體積無意義地增大。為減輕負擔,有人想到針對設(shè)備定制 APK,比如 mdpi APK 一個,hdpi APK 一個,等等。有關(guān) APK 分包的詳細信息,可參閱Build Multiple APKs

相反,設(shè)置分包以后,有的時候會需要不同分辨率的圖標,比如啟動器不同,需要的圖標清晰度不同,所以,要用到 mipmap 目錄。APK 分包時,mipmap 資源會全部包含在 APK 文件中。


GitHub Page: kniost.github.io
簡書:http://www.lxweimin.com/u/723da691aa42

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內(nèi)容

  • 本章內(nèi)容的項目實戰(zhàn)呢,是在美化BeatBox應(yīng)用,由于沒有實踐此應(yīng)用,那以Demo形式來總結(jié)此章的核心知識點吧。 ...
    夜遠曦白閱讀 802評論 0 10
  • 概述 今天我們來探究一下android的樣式。其實,幾乎所有的控件都可以使用 background屬性去引用自定義...
    CokeNello閱讀 4,886評論 1 19
  • 轉(zhuǎn)載自Keegan小鋼并標明原文鏈接:http://keeganlee.me/post/android/20150...
    堅持編程_lyz閱讀 1,136評論 0 1
  • 概述 Android把任何可繪制在屏幕上的圖形圖像都稱為drawable 資源,你可以通過類似getDrawabl...
    小蕓論閱讀 2,738評論 2 5
  • 那霾似神明 無所不知 無處不在 你輕聲慢步 它卻聞聲而來 捂住你的雙眼 悶住你的口鼻 仿若熊孩子般 與他那龐大的身...
    錢遷閱讀 272評論 0 0