標籤:ble 引用 指定 不同的 tor 介面 用法 strong 放大
在Andorid的世界裡,凡事要在螢幕上繪製的東西都可以叫drawable,比如抽象圖形,Drawable的子類,位元影像圖形等,我們之前用來封裝圖片的BitmapDrawable就是一種drawable。
本章我們還會看到更多的drawable:state list drawable、shape drawable和layer list drawable。
這三個drawable都定義在XML檔案中,可以歸為一類,統稱為XML drawable。
shape drawable
使用ShapeDrawable,可以把按鈕編程圓形,XML drawable和螢幕像素密度無關,所以無需考慮建立特定像素密度目錄,直接把它放入預設的drawable檔案夾就可以了。
在res/drawable目錄下建立一個圓形drawable。名為button_beat_box_normal.xml的檔案,代碼如下:
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@color/drak_blue"/> </shape>
該XML檔案定義了一個背景色為深藍色的圓形。 也可以使用shape drawable 定製其他圖形。
最後修改styles中的按鈕背景即可。
state list drawable
根據按鈕的狀態,state list drawable可以切換指向不同的drawable,它會根據按鈕的狀態改變使用的 drawable.
建立一個state list drawable
<?xml version="1.0" encoding="utf-8"?><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>
當按鈕按下時用button_beat_box_pressed作為背景。沒有按下時用button_beat_box_normal作背景。
除了按下狀態,state list drawable還支援禁用,聚焦,以及啟用等狀態。
layer list drawable
layer list drawable能讓兩個XML drawable合二為一,藉助這個工具可以為按下狀態的按鈕添加一個深色的圓環。
1 <?xml version="1.0" encoding="utf-8"?> 2 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item> 4 <shape xmlns:android="http://schemas.android.com/apk/res/android" 5 android:shape="oval"> 6 7 <solid 8 android:color="@color/red"/> 9 </shape>10 </item>11 12 <item>13 <shape14 android:shape="oval">15 <stroke16 android:width="4dp"17 android:color="@color/drak_red"/>18 </shape>19 </item>20 21 </layer-list>
為什麼要用XML drawable
XML Reader用起來方便靈活,不僅用法多樣,還易於更新維護,搭配使用shape drawable和 layer list drawable可以做出複雜的背景圖,連影像編輯器都省了,更改BeatBox應用的配色更是簡單,直接修改XML drawable中的顏色就行了。
XML Reader獨立於螢幕像素密度,它們直接定義在drawable目錄中,不需要加螢幕密度資源修飾符,如果是普通映像,就需要準備多個版本,以適配不同螢幕像素密度的裝置,而XML drawable只要定義一次,就能在任何裝置的螢幕上表現出色。
使用9-patch映像
9-patch映像可以解決映像展開問題,9-patch映像是一種特別處理過的檔案,讓Android知道映像的哪些部分可以展開,哪些不可以。只要處理得當,就能確保背景圖的邊角與原始映像保持一致。為什麼要叫作9-patch呢?9-patch映像分成3×3的網格,即由9部分或9 patch組成的網格。網格角落部分不會被縮放,邊緣部分的4個patch只按一個維度縮放,而中間部分則按兩個維度縮放,:
9-patch映像和普通PNG映像十分相似,只有兩處不同:9-patch影像檔名以.9.png結尾,映像邊緣具有1像素寬度的邊框。這個邊框用以指定9-patch映像的中間位置。邊框像素繪製為黑線,以表明中間位置,邊緣部分則用透明色表示。
使用 Mipmap 映像
資源修飾符和drawable用起來都很方便。應用要用到映像,就針對不同的裝置尺寸準備不同尺寸的圖片,再分別放入drawable-mdpi和drawable-hdpi這樣的檔案夾。然後,按名字引用它們。剩下的就交給Android了,它會根據當前裝置的螢幕密度調用相應的圖片。
有個問題不得不提。發布到Google市集的APK檔案包含了項目drawable目錄裡的所有圖片,哪怕是從來不會用到的圖片。這是個負擔。
有人想到針對裝置定製APK,比如mdpi APK一個,hdpi APK一個,等等。但問題解決得不夠徹底。假如想保留各個螢幕像素密度的啟動表徵圖呢?
Android啟動器是個常駐主畫面的應用(詳見第22章)。按下裝置的主畫面鍵,會回到啟動器應用介面。有些新版啟動器會顯示大尺寸應用表徵圖。想讓大表徵圖清晰好看,啟動器就需要使用更高解析度的表徵圖。對於hdpi裝置,要顯示大表徵圖,啟動器就會使用xhdpi表徵圖。找不到的話,就只能使用低解析度的表徵圖。可想而知,放大展開後的表徵圖肯定很糟。Android的終極解決之道是使用mipmap目錄。
APK分包時,mipmap資源會全部包含在APK檔案中。要一勞永逸,推薦的做法就是,把應用程式啟動器表徵圖放在mipmap目錄中,其他圖片都放在drawable目錄中。
安卓權威編程指南-筆記(第21章 XML drawable)