Layer List
一個LayerDrawable是一個管理着多個drawable對象集合的drawable。集合中的每個drawable按照後進入的在最頂端的規則被繪製
在< layer-list >節點下,每個drawable由一個< item >來表示
文件路徑:res/drawable/filename.xml 文件名就是對應的資源ID
編譯過的資源類型: LayerDrawable
資源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
示例:現有一張圖片位於res/drawable/myimage.png,下面代碼展示瞭如何應與於一個View上
語法
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<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" />
</layer-list>
元素:
< layer-list > 必須,作爲根節點存在,在其內部,有一個或者多個 < item > 子節點
屬性:
- xmlns:android
String類型. 定義了 XML 的命名空間,必須爲”http://schemas.android.com/apk/res/android“。
- xmlns:android
< item > 通過它的屬性定義定義了在drawable層中的一個drawable。必須是< selector >的子元素,也可以是 < bitmap > 的子元素
屬性:android:drawable
Drawable資源,必須,指向一個drawable。android:id
資源ID,爲當前drawable指定一個唯一的ID。如果想要爲當前項創建一個新的ID,可使用如下方法:”@+id/name”。加號表示這裏應該創建一個新的ID。你可以通過 View.findViewById()或者Activity.findViewById()來得到或者修改這個drawable。android:top
Integer類型。距離上方的偏移像素值。android:right
Integer類型。距離右方的偏移像素值。android:bottom
Integer類型。距離下方的偏移像素值。android:left
Integer類型。距離左方的偏移像素值。
默認情況下,所有的Drawable都會通過拉伸來適應容器的大小。因此,把Drawable放置在層中的不同位置可能會導致View容器的大小變大以及部分Drawable會適當的拉伸。爲了避免層中的成員被拉伸,可以使用 < bitmap >替代 < item > 來指定drawable併爲那些不會縮放的成員指定gravity屬性,比如“center”。下面的例子中,< item >定義了一個拉伸同View容器相適應的成員:
<item android:drawable="@drawable/image" />
爲了避免拉伸,下面的例子使用了 < bitmap >並指定gravity屬性爲center:
<item>
<bitmap android:src="@drawable/image"
android:gravity="center" />
</item>
- 示例:
該文件保存在res/drawable/layers.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@drawable/android_red"
android:gravity="center" />
</item>
<item android:top="10dp" android:left="10dp">
<bitmap android:src="@drawable/android_green"
android:gravity="center" />
</item>
<item android:top="20dp" android:left="20dp">
<bitmap android:src="@drawable/android_blue"
android:gravity="center" />
</item>
</layer-list>
我們注意到在這個例子中嵌套使用了< bitmap >來定義drawable資源並指定了gravity屬性爲“center”。這保證了圖像不會被縮放來適應容器的大小,由於調整圖像的大小而產生偏移。
下面展示如何把定義的drawable用於一個View
<ImageView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/layers" />
最終結果是得到一些偏移的圖像:
State List
一個StateListDrawable表示了一個根據對象的不同狀態展示不同圖形的drawable對象。比如,一個按鈕可以存在一個或多個狀態(按下、焦點或者其他),通過使用State List,你可以爲每一個狀態都指定一個背景圖。
你可以在一個XML文件中定義State List。每個圖像由定義在< selector >節點下的 < item >節點來表示。每個< item >使用各種屬性來來描述此時該使用何種圖像來表示狀態。在狀態改變時,State List會從頭到尾的變量每一個元素,首個符合狀態定義的元素將會被使用,這種選擇方式並非是“最優選”,僅僅是找到一個符合最低標準的首項。
文件路徑:res/drawable/filename.xml 文件名就是對應的資源ID
編譯過的資源類型: StateListDrawable
資源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
語法:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]
android:dither=["true" | "false"]
android:variablePadding=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_hovered=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_activated=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
元素:
< selector > 必須,作爲根節點存在,在其內部,有一個或者多個 < item > 子節點
屬性:
xmlns:android
String類型. 定義了 XML 的命名空間,必須爲”http://schemas.android.com/apk/res/android“。android:constantSize
布爾類型,”true”表示當狀態改變時,drawable的大小不變(所有狀態下均爲最大值)。“false”表示大小變化基於當前狀態,默認值爲flase。android:dither
布爾類型,“true”表示開啓抗抖動,當位圖和屏幕不具有相同的像素配置(例如:一個RGB 565屏幕和ARGB 8888位圖)時生效。“false”停用抗抖動,默認爲true。android:variablePadding
布爾類型,“true”表示drawable的padding值會根據選擇後狀態發生變化;“false”表示padding值會保持不變(基於所有狀態下的最大值)。啓用此功能後當狀態變化時需要你來處理佈局,這往往是不建議的。默認爲false。
< item > 通過它的屬性定義了對應狀態的一個drawable。必須是< selector >的子元素。
屬性:
android:drawable
Drawable資源,必須,指向一個drawable。android:state_pressed
布爾類型。”true” 表示該資源應用於按下狀態 (比如一個按鈕的touch/clicked事件);”false” 應用於正常的非點擊狀態下。android:state_focused
布爾類型。 “true” 表示該資源用於獲得輸入焦點狀態(比如用戶選擇了一個輸入框控件時);”false” 應用於正常的非焦點狀態下。android:state_hovered
布爾類型。 “true” 表示該資源用於光標懸停狀態; “false” 應用於正常的非光標懸停狀態。通常來講, 這個圖像資源同 “focused” 狀態下的圖像資源是同一個。
在API level 14中有介紹。android:state_selected
布爾類型。”true” 表示該資源用於用戶選擇一個導航欄中的某一項(比如使用方向鍵選擇了導航欄中的某項);”false” 應用於非選擇狀態。
該狀態用於焦點狀態並不足以表達狀態的情況下(比如一個列表獲得了焦點隨後其內部的item被方向鍵選中)android:state_checkable
布爾類型。 “true” 表示該資源用於可選中狀態 “false” 應用於正常的不可選中狀態。(只對可以在checkable和non-checkable間切換的控件有效)android:state_checked
布爾類型。 “true” 表示該資源用於被選中狀態; “false” 應用於正常的非選中狀態。android:state_enabled
布爾類型。 “true” 表示該資源用於啓用狀態(能夠接收觸摸/單擊事件); “false” 應用於正常的禁用狀態。android:state_activated
布爾類型。”true”表示該資源用於持久的激活狀態(比如在導航欄中的高亮選中項); “false” 應用於非激活狀態.
在API level 11中有介紹。android:state_window_focused
布爾類型。”true”表示該資源用於應用窗口獲得焦點(即應用在前臺運行), “false”應用於應用窗口沒有得到焦點的狀態 (比如,通知欄下拉或者是有個dialog彈出時 )。
示例
該文件保存在res/drawable/button.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/button_pressed" /> <!-- pressed -->
<item android:state_focused="true"
android:drawable="@drawable/button_focused" /> <!-- focused -->
<item android:state_hovered="true"
android:drawable="@drawable/button_focused" /> <!-- hovered -->
<item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>
下面的佈局XML中的按鈕使用了上面定義的list drawable
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/button" />
也可以參考:
Level List
一個管理多個交替顯示元素集合的Drawable。每個元素分配了一個最大的數字數值。通過setLevel() 方法對drawable來設定level數值,就會得到android:maxLevel值大於或等於level值的對應Drawable資源。
文件路徑:res/drawable/filename.xml 文件名就是對應的資源ID
編譯過的資源類型: LevelListDrawable
資源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
語法:
<?xml version="1.0" encoding="utf-8"?>
<level-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/drawable_resource"
android:maxLevel="integer"
android:minLevel="integer" />
</level-list>
元素:
< level-list> 作爲根節點存在,在其內部,有一個或者多個 < item > 子節點
屬性:
- xmlns:android
String類型. 定義了 XML 的命名空間,必須爲”http://schemas.android.com/apk/res/android“。
- xmlns:android
< item > 定義了對應某些level的drawable
屬性:
android:drawable
Drawable資源,必須,指向一個drawable。android:maxLevel
Integer類型。 當前itme的level上限。android:minLevel
Integer. 當前itme的level下限。
示例:
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/status_off"
android:maxLevel="0" />
<item
android:drawable="@drawable/status_on"
android:maxLevel="1" />
</level-list>
一旦這被應用到一個View,level值可以通過setLevel() 或者 setImageLevel()來改變。
也可以參考:
Transition Drawable
TransitionDrawable是可以實現兩個drawable資源間淡入淡出效果的drawable對象。
每個drawable可由一個< item >元素在唯一的< transition >節點中表示。但是不可以多餘兩個item。想要開始切換,調用starttransition()方法。想要回復切換前狀態,調用reversetransition()方法。
文件路徑:res/drawable/filename.xml 文件名就是對應的資源ID
編譯過的資源類型: TransitionDrawable
資源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
語法:
<?xml version="1.0" encoding="utf-8"?>
<transition
xmlns:android="http://schemas.android.com/apk/res/android" >
<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" />
</transition>
元素:
< transitiont >必須,作爲根節點存在,在其內部,有一個或者多個 < item > 子節點
屬性:
- xmlns:android
String類型. 定義了 XML 的命名空間,必須爲”http://schemas.android.com/apk/res/android“。
- xmlns:android
< item > 定義了整個過程中的一個drawable,必須是< transition >的子節點,也可以是< bitmap >來作爲子節點
屬性:
android:drawable
Drawable資源,必須,指向一個drawable。android:id
資源ID,爲當前drawable指定一個唯一的ID。如果想要爲當前項創建一個新的ID,可使用如下方法:”@+id/name”。加號表示這裏應該創建一個新的ID。你可以通過 View.findViewById()或者Activity.findViewById()來得到或者修改這個drawable。android:top
Integer類型。距離上方的偏移像素值。android:right
Integer類型。距離右方的偏移像素值。android:bottom
Integer類型。距離下方的偏移像素值。android:left
Integer類型。距離左方的偏移像素值。
示例
該文件保存在 res/drawable/transition.xml:
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/on" />
<item android:drawable="@drawable/off" />
</transition>
下面的佈局XML中的ImageButton使用了上面定義的Transition Drawable
<ImageButton
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/transition" />
下面的代碼執行了一個500ms內的圖像漸變:
ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);
也可以參考:
Inset Drawable
定義了一個Drawable根據一定距離插入到另外一個Drawable中的XMl文件,當需要對一個View指定一個小於它自身大小的背景圖時,可以使用它。
文件路徑:res/drawable/filename.xml 文件名就是對應的資源ID
編譯過的資源類型: InsetDrawable
資源引用:
- JAVA中: R.drawable.filename
- XML中: @[package:]drawable/filename
語法:
<?xml version="1.0" encoding="utf-8"?>
<inset
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/drawable_resource"
android:insetTop="dimension"
android:insetRight="dimension"
android:insetBottom="dimension"
android:insetLeft="dimension" />
元素:
< inset >定義了 inset drawable,作爲根節點存在
屬性:
xmlns:android
String類型. 定義了 XML 的命名空間,必須爲”http://schemas.android.com/apk/res/android“。android:drawable
Drawable資源,必須,指向一個drawable。android:insetTop
Dimension(DP單位)。距離上方的DP尺寸,可以爲指定的DP數值或者DP資源android:insetRight
Dimension(DP單位)。距離右方的DP尺寸,可以爲指定的DP數值或者DP資源android:insetBottom
Dimension(DP單位)。距離下方的DP尺寸,可以爲指定的DP數值或者DP資源android:insetLeft
Dimension(DP單位)。距離左方的DP尺寸,可以爲指定的DP數值或者DP資源
示例
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/background"
android:insetTop="10dp"
android:insetLeft="10dp" />
也可以參考: