前段時間專案不著急,想到對 Drawable 這個知識點不熟悉,所以就想著通過練習寫自定義 Drawable 來熟悉下。
Drawable 簡介(翻譯自 Google 文件)
Drawable 是 可繪製物件 的抽象,與 android.view.View
不同,Drawable 沒有任何功能接收事件或其他方式與使用者互動。
Android 的所有版本都允許在執行時擴充套件和使用 Drawable
類代替框架提供的 drawable
類。在 API 24 開始,可以在 XML 中使用自定義 Drawable 。
注意:自定義 Drawable 只能在應用程式中訪問,其他應用程式將無法載入它們。
自定義 Drawable 至少必須在 Drawable 上實現抽象方法,並且應該覆蓋 draw(Canvas)
方法來繪製內容。
可以以多種方式在 XML 中使用自定義 Drawable 類:
使用完全限定類名作為 XML 元素名稱。對於此方法,自定義 drawable 類必須是公共頂級類。
<com.example.CustomDrawable xmlns:android="http://schemas.android.com/apk/res/android"/>複製程式碼
使用 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();複製程式碼