Android的Drawable體系

官方文檔中對Drawable的定義爲:可繪製物件的一般抽象(A Drawable is a general abstraction for 『something that can be drawn』)。『可繪製的』本身也是個抽象的概念,而且容易讓我們聯想到Android裏另一個較抽象的概念『View』,我們知道View也是可以繪製的,那View是不是也可以稱爲Drawable呢?官方的文檔中也有這樣一句:Unlike a View, a Drawable does not have any facility to receive events or otherwise interact with the user. Drawable與View不同,Drawable不接受事件,無法與用戶進行交互。也就是說與Drawable相比View更輕量級。

我們在開發中也經常對圖片設置點擊事件,明明可以接受和響應事件啊,但是仔細想想,響應事件的是ImageView,而不是我們顯示在ImageView上的Drawable,所以這也正體現了View和Drawable的區別。

與Drawable相關的源碼全在
android/platform/frameworks/base/graphics/java/android/graphics/drawable/包下。

Drawable中幾個比較常用的創建一個Drawable對象靜態方法。
這裏寫圖片描述

Drawable類繼承圖

Drawable是一個抽象類,Android FrameWork提供了一些具體的Drawable實現,它們的繼承關係如下圖:
這裏寫圖片描述

Drawable的分類

不同的圖形圖像資源就代表着不同的drawable類型。Android中具體的Drawable實現有:

  • Bitmap File 普通的位圖文件(.png, .jpg, or .gif) 對應一個BitmapDrawable對象,XML中的根元素爲。
  • Nine-Patch File 即我們常說的”點九圖”,可以基於自動適應內容大小而伸縮區域的png圖片,創建一個NinePatchDrawable對象。
  • Layer List 用來管理多個drawable的數組,索引值最大的圖層繪製在最上面,創建一個LayerDrawable對象,XML中的根元素爲。
  • State List 用來根據不同的狀態來引用不同的位圖圖形,創建一個StateListDrawable對象,XML中的根元素爲。
  • Level List 一個LeveListDrawable管理着一組交替的drawable資源,level-list中某項的android:maxLevel數值大於或者等於setLevel設置的數值,就會被加載,創建一個LevelListDrawable對象,XML中的根元素爲。。
  • Transition Drawable 定義一個可以在兩張圖片資源之間實現淡入淡出效果的TransitionDrawable對象,XML中的根元素爲。
  • Inset Drawable 定義一個根據指定的距離嵌入到另一個drawable的圖片資源,創建一個TransitionDrawable對象,XML中的根元素爲。
  • Clip Drawable 定義一個從當前drawable上截取一個”圖片片段”的圖片類型,創建一個ClipDrawable對象,XML中的根元素爲。
  • Scale Drawable 定義一個基於當前的level,對當前drawable進行尺寸縮放後的drawable類型,XML中的根元素爲。
  • Shape Drawable 定義一個包含顏色和漸變的幾何圖形,創建一個 ShapeDrawable對象,XML中的根元素爲。
  • Animation Drawable 表示逐幀動畫,xml中的根元素爲
  • Color Drawable 顏色資源也可以作爲一個drawable.例如我們在設置一個View的background時,經常使用android:drawable=”@color/blue”的方式。

詳細的信息可以查看官方文檔:
http://developer.android.com/intl/zh-cn/guide/topics/resources/drawable-resource.html

除了這些預置的drawable實現類以外,也可以自定義drawable的實現類型,但是Android FrameWork提供的drawable實現類型已經能滿足絕大部分的需求。在實際開發中,我們一般通過xml文件來定義複雜的drawable類型,只有在程序中需要修改drawable的屬性時,才需要使用具體的drawable類型提供的方法來處理。

在上面的分類中,Bitmap,Nine-Patch,State List比較常用。例如一個按鈕的不同狀態下的背景圖片就是通過State List實現,

<?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>

Level List使用較少,但也比較簡單,比如WiFi信號會根據不同的強度顯示不同的圖片。


<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0" android:drawable="@drawable/ic_wifi_signal_1" />
<item android:maxLevel="1" android:drawable="@drawable/ic_wifi_signal_2" />
<item android:maxLevel="2" android:drawable="@drawable/ic_wifi_signal_3" />
<item android:maxLevel="3" android:drawable="@drawable/ic_wifi_signal_4" />
</level-list>

另外的幾種類型將單獨介紹。


原文鏈接:https://liuzhichao.com/2016/android-drawable.html

其他幾篇:

Android Drawable之LayerDrawable

Android Drawable之TransitionDrawable

Android Drawable之InsetDrawable

Android Drawable之ClipDrawable

Android Drawable之ScaleDrawable

Android Drawable之ShapeDrawable

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