Drawable Resources Part II(Drawable 資源 第二部分)

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 > 子節點

    屬性:

  • < 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 > 子節點

    屬性:

  • < 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 > 子節點

    屬性:

  • < 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" />

也可以參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章