【Android Drawable系列】- 多個Drawable

Android Drawable系列
本文要說明的是可以使用多個drawable的drawble資源標籤。
Layer list
layer-list
可以管理一組drawable的標籤,每個drawable都按檔案中的順序繪製,也就是列表中的最後一個會繪製在頂部。在 layer-list
中每個drawable需要使用 <item>
表示。
先來看看例子:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/shape_gradient" android:gravity="center"/> <item android:drawable="@drawable/shape_gradient" android:gravity="center" android:left="40dp" android:top="30dp"/> <item android:drawable="@drawable/shape_gradient" android:gravity="center" android:left="80dp" android:top="60dp"/> </layer-list>
這是實際效果:

<layer-list>
並沒有什麼屬性,直接看看<item>的屬性
<item android:drawable="@[package:]drawable/drawable_resource" android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" />
-
android:drawable
:屬性不用多說了,就是drawable資源的引用 -
android:id
:可以為當前的<item>
設定資源id,可以通過LayerDrawable.findDrawableByLayerId()
獲取到對應的drawable
物件 -
android:left|top|right|bottom
:則是對應當前drawable
顯示的各個對應邊的距離 -
android:gravity
:item
也是支援gravity的屬性的
獲取layer-list中的drawable程式碼如下:
final ImageView imageView = findViewById(R.id.image); LayerDrawable drawable = (LayerDrawable) imageView.getDrawable(); Drawable layerDrawable1 = drawable.findDrawableByLayerId(R.id.layer_drawable_1);
另外, <item>
是支援雙標籤使用的,在 <item></item>
之間也是可以是寫 drawable
進行使用的,例如:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:gravity="center"> <shape > <solid android:color="#000"/> </shape> </item> </layer-list>
State list
使用不同的drawable來表示不同的狀態,也就是我們平常使用的 <selector>
標籤,配合 <item>
標籤組合使用。每個 <item>
使用屬性來表示所對應的狀態,在狀態變更時,會從上到下遍歷 <item>
的列表,會使用與當前狀態匹配的第一個 <item>
標籤中的 drawable
,並不是最佳匹配。
首先看看 selector
有什麼屬性
android:visiable android:autoMirrored android:constantSize android:variablePadding android:enterFadeDuration android:exitFadeDuration
再來看看都有什麼狀態,這是 compileSdkVersion 28
聯想出來的程式碼提示

android:state_accelerated android:state_activated android:state_active android:state_checkable android:state_drag_can_accept android:state_drag_hovered android:state_checked android:state_enabled android:state_focused android:state_hovered android:state_pressed android:state_selected android:state_window_focused
其中還是幾個屬性並沒有找到具體是什麼含義,也沒有試出來
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/shape_selected" android:state_selected="true"/> <item android:drawable="@drawable/shape_focused" android:state_focused="true"/> <item android:drawable="@drawable/shape_pressed" android:state_pressed="true"/> <item android:drawable="@drawable/shape_gradient"/> </selector>
同樣的,在使用 <item></item>
時可以使用其他的 drawable
標籤,還可以使 animated-rotate
、 animated-selector
、 animation-list
。
Level list
用於管理多個備用Drawable的drawable物件,使用setLevel()設定drawable的級別,根據設定的level顯示符合在 minLevel<= level <= maxLevel
的的drawable。
item的屬性
android:drawable android:maxLevel android:minLevel
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/icon" android:maxLevel="10"/> <item android:drawable="@drawable/shape_gradient" android:minLevel="11" android:maxLevel="12"/> </level-list>
需要在java程式碼中使用 setLevel
或者 setImageLevel
來改變level的值
如果所設定的level值,在<level-list>的<item>中找不到符合條件的將會顯示成空白。顯示的順序是從上到下,符合 minLevel<= level <= maxLevel
條件的優先顯示。
Transition drawable
TransitionDrawable
是一個可以在兩個drawable之間交叉淡出淡入的drawable物件。使用 <transition>
標籤和 <item>
標籤,而 <item>
標籤不能超過兩個。可以使用 startTransition()
開始變換也可以呼叫 reverseTransition()
還原.
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/shape_gradient"/> <item android:drawable="@drawable/shape_gradient_90"/> </transition>
具體java程式碼
ImageView imageView = findViewById(R.id.image); TransitionDrawable drawable = (TransitionDrawable) imageView.getDrawable(); drawable.startTransition(300); //drawable.reverseTransition(300);
<item>
的屬性還支援 android:id
、 android:left
、 android:top
、 android:right
和 android:bottom
,用法和之前相同就不說了。