LevelListDrawable 的使用

在開發 Battery Widget 時,需要在不同電量狀態下顯示對應的圖檔,比如電量 100% 時顯示電池全滿的圖,電量 50% 的時候則顯示半滿的圖。那時很單純的用一堆 if else 來判斷,然後在裡面分別 setImageResource()。當然這樣也不是不行,但看到程式碼裡一堆判斷式,就覺得有點討厭。最近發現原來 Android 早就有替類似的需求設計了 LevelListDrawable,而且是 Since: API Level 1。(我真是太不用功了@@)

用法很簡單,範例如下:
1.首先當然得先準備好不同 Level 的圖檔。

2.在 res/drawable 裡新增一個 battery_level.xml 內容如下:
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="20" android:drawable="@drawable/battery_20" />
    <item android:maxLevel="40" android:drawable="@drawable/battery_40" />
    <item android:maxLevel="60" android:drawable="@drawable/battery_60" />
    <item android:maxLevel="80" android:drawable="@drawable/battery_80" />
    <item android:maxLevel="100" android:drawable="@drawable/battery_100" />
</level-list>
可以看出是用 <level-list> 標籤來包 <item>,而每個 <item> 中分別指定數值範圍及圖檔。

3.在 Layout 中把這個上面這個 xml 指定給需要變換圖案的 ImageView:
<ImageView
        android:id="@+id/imageview_battery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ battery_level" >
</ImageView>

4.當電量變動時呼叫 ImageView 的 setImageLevel() 方法並帶入數值即可;
imageView.setImageLevel(50);
若是在 Widget 內則可用 RemoteViews 的 setInt() 方法來設定:
remoteViews.setInt(R.id.imageview_battery, "setImageLevel", 50);

參考連結:
http://developer.android.com/reference/android/graphics/drawable/LevelListDrawable.html

這個網誌中的熱門文章

Android Studio 如何調整字型大小

App 在 Google Play 被停權與恢復的經驗分享

Android Studio 無法在實機上 Run/Debug 程式?