自定義 Drawable

奮鬥的Leo發表於2017-06-06

前段時間專案不著急,想到對 Drawable 這個知識點不熟悉,所以就想著通過練習寫自定義 Drawable 來熟悉下。

Drawable 簡介(翻譯自 Google 文件)

Drawable 是 可繪製物件 的抽象,與 android.view.View 不同,Drawable 沒有任何功能接收事件或其他方式與使用者互動。

Android 的所有版本都允許在執行時擴充套件和使用 Drawable 類代替框架提供的 drawable 類。在 API 24 開始,可以在 XML 中使用自定義 Drawable 。

注意:自定義 Drawable 只能在應用程式中訪問,其他應用程式將無法載入它們。

自定義 Drawable 至少必須在 Drawable 上實現抽象方法,並且應該覆蓋 draw(Canvas) 方法來繪製內容。

可以以多種方式在 XML 中使用自定義 Drawable 類:

  1. 使用完全限定類名作為 XML 元素名稱。對於此方法,自定義 drawable 類必須是公共頂級類。

    <com.example.CustomDrawable xmlns:android="http://schemas.android.com/apk/res/android"/>複製程式碼
  2. 使用 drawable 作為 XML 元素名稱,並從類屬性中指定完全限定的類名。此方法可用於公共頂層類和公共靜態內部類。

    <drawable xmlns:android="http://schemas.android.com/apk/res/android"
              class="com.example.TopDrawable$CustomDrawable"
              />複製程式碼

Drawable.ConstantState

ConstantState 用於在不同的 Drawable 之間儲存共同的恆定狀態和資料。例如:從同一個資源建立的 BitmapDrawables 將共享儲存在它們的 ConstantState 中的同一個單獨的 Bitmap。

newDrawable(Resources) 可以作為一個工廠類被用來建立新的 Drawable 從當前的 ConstantState。

使用 getConstantSatte() 從一個 Drawable中取回 ConstantState。

在 Drawable 中呼叫 mutate() 通常應該為這個 Drawable 建立一個新的 ConstantState。

自定義 Drawable 侷限性
  • 動態改變 Drawable 繪製的尺寸屬性(比如,繪製的變局或者其中文字的大小),需要呼叫設定了 Drawable 的物件(一般為 View )去重新測量尺寸。getBounds 方法可能返回不同的尺寸,但真實尺寸可能不會改變。
自定義 Drawable 實現抽象方法
//返回 Drawable 的真實尺寸。用於設定了 Drawable 的物件在測量時,考慮的合適尺寸
    @Override
    public int getIntrinsicWidth() {
        return mIntrinsicWidth;
    }

    @Override
    public int getIntrinsicHeight() {
        return mIntrinsicHeight;
    }

//返回當前 Drawable 為透明/不透明
public abstract @PixelFormat.Opacity int getOpacity();複製程式碼

實踐

自定義 Drawable
效果圖

github 地址

相關文章