1. 程式人生 > >自定義View-Bitmap和BitmapDrawable

自定義View-Bitmap和BitmapDrawable

Bitmap 譯為“點陣圖”,用於儲存 png、jpg、gif 等格式的圖片資料,很多時候如果需要在 Android中對圖片進行處理,需要先將圖片讀入 Bitmap 物件,接著呼叫相關的 API 對圖片進行處理和加工,圖片讀取操作是由 BitmapFactory 類完成的,該類定義了若干方法用於讀取圖片資料:
public static Bitmap decodeStream(InputStream is)

從輸入流中讀取圖片資料並轉換成 Bitmap 物件

public static Bitmap decodeByteArray(byte[] data,int offset,int length)

從位元組陣列中讀取圖片資料並轉換成 Bitmap 物件

public static Bitmap decodeResource(Resources res,int id)

從 Android 的 drawable 資源(res/drawable)目錄中讀取圖片資料並轉換成 Bitmap 物件

public static Bitmap decodeFile(String pathName)

從圖片檔案中讀取圖片資料並轉換成 Bitmap 物件


我們也可以建立一張空白圖片,空白圖片需要指定寬度、高度和儲存格式(ARGB_4444、ARGB_8888、ALPHA_8)等資訊,Bitmap 中用來建立空白圖片最簡單的方法是
public static Bitmap createBitmap(int width,int height,Config config),該方法是 static 方法,不需要建立 Bitmap 物件即可直接呼叫。
下列的程式碼建立了一個 400*400 的 ARGB_8888 型別的空白點陣圖物件:
Bitmap bmp = Bitmap.createBitmap(400, 400,Config.ARGB_8888);
位於 res/drawable 目錄下的圖片讀成 Bitmap 物件後是無法修改的,若要修改必須複製一張新的圖片並設定可修改標記,Bitmap 類的 copy()方法能完成該功能,方法簽名如下:
public Bitmap copy(Config config,boolean isMutable)

引數 isMutable 為 true 表示複製的新點陣圖可以修改。Bitmap 是一種非常佔用資源的物件,不管是什麼手機,如果沒有處理好很容易導致 App 崩潰,所以,及時回收 Bitmap 記憶體是一個好習慣,涉及到的方法有兩個:

public final boolean isRecycled()

判斷是否已回收,返回 true 表示記憶體已被回收


public void recycle()
回收 Bitmap 記憶體,同一個 Bitmap 物件不能連續回收多次,所以在回收之前最好是先判斷。不過從原始碼中發現其實該方法已經自己判斷過了。常見的回收 Bitmap 資源的程式碼形如(bmp 為 Bitmap 物件):
if(bmp!=null && !bmp.isRecycled()) {
         bmp.recycle();
         System.gc();//提醒JVM釋放資源
         bmp = null;
}

繪圖中 Bitmap 是一個很重要的類,為了提高繪圖的效能,通常會使用“雙快取”技術,“雙快取”技術就是先將圖繪製在 Bitmap 上,再統一顯示出來;另外,在繪圖軟體的開發中,Bitmap 常用於儲存繪製結果,而使用者看到的繪製過程是需要和結果分離的。BimapDrawable 是 Android 的一種通用點陣圖格式,我們可以簡單粗暴地理解成 Bitmap 的另外一種表現形式。但是和 Bitmap 相比 BimapDrawable 佔用資源更少、效能更高。


Bitmap 和 BitmapDrawable 在一些情況下需要相互轉換,BitmapDrawable 的構造方法:

public BitmapDrawable(Resources res,Bitmap bitmap)

用於將Bitmap轉換成BitmapDrawable,而getBitmap()方法則用於將 BitmapDrawable 轉換成 Bitmap。


Bitmap 和 BitmapDrawable 都能獲得點陣圖的寬度和高度,對比如下:
Bitmap: getWidth()   getHeight()
BitmapDrawable:  getIntrinsicWidth() getIntrinsicHeight()