Drawable 使用詳解


極力推薦文章:歡迎收藏
Android 干貨分享

閱讀五分鍾,每日十點,和您一起終身學習,這里是程序員Android

DrawableAndroid 中圖像顯示的常用方法。
概念:Drawable 是指可在屏幕上繪制的圖形,已經通過getDrawable(int)等API檢索或者應用到具有 android:drawableandroid:icon 等屬性的其他 XML 資源的圖形。

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:

  1. Drawable 分類
  2. Bitmap 位圖 BitmapDrawable
  3. 可拉伸圖(*.9.png) NinePatchDrawable。
  4. 圖層 LayerDrawable
  5. 不同狀態圖(選擇器) StateListDrawable
  6. 級別列表 LevelListDrawable
  7. 轉換圖像 TransitionDrawable
  8. 插入可繪制對象
  9. 剪裁可繪制對象 ClipDrawable
  10. 縮放可繪制對象 ScaleDrawable
  11. 形狀可繪制對象 ShapeDrawable
  12. Drawable與 Bitmap 常用方法總結

1.Drawable 簡介

繼承關系如下:

[java.lang.Object]
   ↳
     android.graphics.drawable.Drawable

Drawable 分類如下:

  1. Bitmap 位圖 BitmapDrawable
  2. 可拉伸圖(*.9.png) NinePatchDrawable。
  3. 圖層 LayerDrawable
  4. 不同狀態圖(選擇器) StateListDrawable
  5. 級別列表 LevelListDrawable
  6. 轉換圖像 TransitionDrawable
  7. 插入可繪制對象
  8. 剪裁可繪制對象 ClipDrawable
  9. 縮放可繪制對象 ScaleDrawable
  10. 形狀可繪制對象 ShapeDrawable

資源引用:

Java 中:
R.drawable.filename

XML 中:
@[package:]drawable/filename

1. Bitmap 位圖 BitmapDrawable

位圖圖像。Android 支持以下三種格式的位圖文件:.png(首選)、.jpg(可接受)、.gif(不建議)。這些文件保存到 res/drawable/ 目錄中

在構建過程中,可通過aapt工具自動優化位圖文件,對圖像進行無損壓縮。例如,不需要超過 256 色的真彩色 PNG 可通過調色板轉換為 8 PNG。這樣產生的圖像質量相同,但所需內存更少。因此請注意,此目錄中的圖像二進制文件在構建時可能會發生變化。如果您計划將圖像解讀為比特流以將其轉換為位圖,請改為將圖像放在res/raw/文件夾中,在那里它們不會進行優化

使用方法如下:

1.常規位圖

  • XML 布局中使用方法
        <ImageView
            android:id="@+id/img_round"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/gril" />
  • Java 代碼中使用方法
getResources().getDrawable(R.drawable.xml_bitmap)

2.XML 位圖

  • 在XML中創建位圖資源文件

注意一下屬性使用方法:

  1. antialias
    啟用、停用抗鋸齒

  2. dither
    當位圖的像素配置與屏幕不同時(例如:RGB 8888 位圖和 RGB 565 屏幕),啟用或停用位圖抖動。

3. `filter `
       啟用或停用位圖過濾。當位圖收縮或拉伸以使其外觀平滑時使用過濾。
  1. mipmap
    啟用或停用mipmap提示

5.tileMode
定義平鋪模式。當平鋪模式啟用時,位圖會重復。重力在平鋪模式啟用時將被忽略
xml_bitmap 位圖實現

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:antialias="true"
    android:dither="true"
    android:filter="false"
    android:gravity="center_vertical|clip_vertical"
    android:mipMap="true"
    android:src="@drawable/gril"
    android:tileMode="repeat" >

    <!--
    antialias   
           啟用、停用抗鋸齒  
    dither 
           當位圖的像素配置與屏幕不同時(例如:ARGB 8888 位圖和 RGB 565 屏幕),啟用或停用位圖抖動。
    filter 
           啟用或停用位圖過濾。當位圖收縮或拉伸以使其外觀平滑時使用過濾。
    mipmap 
          啟用或停用 mipmap 提示
    tileMode 
        定義平鋪模式。當平鋪模式啟用時,位圖會重復。重力在平鋪模式啟用時將被忽略

    -->

</bitmap>
  • 引用XML位圖資源方法
        <ImageView
            android:id="@+id/img_drawable_bitmap"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:src="@drawable/xml_bitmap" />

  • java 代碼實現方法
    java 代碼使用位圖的方法

2. 可拉伸圖(*.9.png) NinePatchDrawable。

NinePatch 是一種 PNG 圖像,在其中可定義當視圖中的內容超出正常圖像邊界時 Android 縮放的可拉伸區域。此類圖像通常指定為至少有一個尺寸設置為 "wrap_content" 的視圖的背景,而且當視圖擴展以適應內容時,九宮格圖像也會擴展以匹配視圖的大小。Android 的標准 Button 小部件使用的背景就是典型的九宮格圖像,其必須拉伸以適應按鈕內的文本(或圖像)。

    1. 常規使用方法同其他圖片引用方式
    1. XML .9.png 圖片同Bitmap XML的使用方式
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/main_bg_green"
    android:dither="false">
</nine-patch>

3. 圖層 LayerDrawable

LayerDrawable 是管理其他可繪制對象陣列的可繪制對象。列表中的每個可繪制對象按照列表的順序繪制,列表中的最后一個可繪制對象繪於頂部。每個可繪制對象由單一 <layer-list> 元素內的 <item> 元素表示。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/bird001"
        android:drawable="@drawable/bird0001_risk">
    </item>
    <item
        android:id="@+id/bird002"
        android:drawable="@drawable/bird0002_risk"
        android:left="50dp"
        android:top="50dp">
    </item>
    <item
        android:id="@+id/bird003"
        android:drawable="@drawable/bird0003_risk"
        android:left="100dp"
        android:top="100dp">
    </item>

</layer-list>

4. 不同狀態圖(選擇器) StateListDrawable

StateListDrawable 是在 XML 中定義的可繪制對象,它根據對象的狀態,使用多個不同的圖像來表示同一個圖形。例如,Button 小部件可以是多種不同狀態(按下、聚焦或這兩種狀態都不是)中的其中一種,而且可以利用狀態列表可繪制對象為每種狀態提供不同的背景圖片。

您可以在 XML 文件中描述狀態列表。每個圖形由單一 <selector> 元素內的 <item> 元素表示。每個<item>均使用各種屬性來描述應用作可繪制對象的圖形的狀態。

在每個狀態變更期間,將從上到下遍歷狀態列表,並使用第一個與當前狀態匹配的項目 —此選擇並非基於“最佳匹配”,而是選擇符合狀態最低條件的第一個項目。
此方法非常常用,比如狀態選擇器

    1. 常規使用方法同其他圖片引用方式
    1. 選擇器 XML的使用方式

狀態選擇器

5. 級別列表 LevelListDrawable

管理大量備選可繪制對象的可繪制對象,每個可繪制對象都分配有最大的備選數量。使用setLevel()設置可繪制對象的級別值會加載級別列表中 android:maxLevel 值大於或等於傳遞到方法的值的可繪制對象資源。
資源引用:
在 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/gril"
        android:maxLevel="100"
        android:minLevel="10"/>

</level-list>

可通過 setLevel() setImageLevel() 更改級別。

6. 轉換圖像 TransitionDrawable

TransitionDrawable 是可在兩種可繪制對象資源之間交錯淡出的可繪制對象。

每個可繪制對象由單一<transition>元素內的 <item> 元素表示。不支持超過兩個項目。要向前轉換,請調用 startTransition()。要向后轉換,則調用 reverseTransition()

  • xml 布局聲明
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bird0001_risk" />
    <item android:drawable="@drawable/bird0002_risk" />
</transition>
  • java 代碼中使用

java代碼中TransitionDrawable使用方法

7. 插入可繪制對象

XML 文件中定義的以指定距離插入其他可繪制對象的可繪制對象。當視圖需要小於視圖實際邊界的背景時,此類可繪制對象很有用。

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/gril"
    android:insetBottom="10dp"
    android:insetLeft="10dp"
    android:insetRight="10dp"
    android:insetTop="10dp"
    android:visible="true" >

</inset>

8. 剪裁可繪制對象 ClipDrawable

XML 文件中定義的對其他可繪制對象進行裁剪(根據其當前級別)的可繪制對象。您可以根據級別以及用於控制其在整個容器中位置的重力,來控制子可繪制對象的裁剪寬度和高度。通常用於實現進度欄之類的項目。

  • xml 初始化剪裁樣式
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@drawable/gril"
    android:gravity="center" >

</clip>
  • java 代碼中使用

ClipDrawable java 代碼中使用方法

9. 縮放可繪制對象 ScaleDrawable

XML 文件中定義的更改其他可繪制對象大小

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/gril"
    android:scaleGravity="center"
    android:scaleHeight="10%"
    android:scaleWidth="10%" >

</scale>

10. 形狀可繪制對象 ShapeDrawable

XML 中定義的一般形狀。

  1. 繪制直線
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >
    <gradient
        android:angle="45"
        android:centerX="0.5"
        android:centerY="0.5"
        android:centerColor="@android:color/holo_green_dark"
        android:endColor="@android:color/holo_orange_light"
        android:gradientRadius="5dp"
        android:startColor="@android:color/holo_purple"
        android:type="linear"
        android:useLevel="true"/>"
    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp" />
    <size
        android:width="1dp"
        android:height="1dp" />
    <solid
        android:color="@android:color/holo_orange_light" />
    <stroke
        android:width="5dp"
        android:color="@android:color/darker_gray"
        android:dashWidth="5dp"
        android:dashGap="5dp" />
</shape>

2.繪制圓角矩形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <!-- 圓角-->
    <corners android:radius="5dp" />
    <!--描邊-->
    <stroke
        android:width="1dp"
        android:color="@android:color/holo_blue_light" />

</shape>

12. Drawable與 Bitmap 常用方法總結

由於涉及內容比較多,已經另起文章講述。

Drawable與 Bitmap 常用方法總結

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

微信關注公眾號:  程序員Android,領福利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM