最後來介紹一下 Chet Haase 在 DevBytes 示範的 inBitmap 的用法
public boolean inJustDecodeBounds
若設為 true 則呼叫 BitmapFactory 的 decode 類方法時會回傳 null(不會有像素占用記憶體)
但 BitmapFactory.Options 的 out 類屬性(有以下三個: outWidth, outHeight, outMimeType) 會有值
所以可以用來查詢圖片原本的長寬訊息之類的
public int inSampleSize
若設定該屬性大於 1 則讀取 Bitmap 資料時會讀入較少的像素
但傳入的數值若不是 2 的次方,則會降為最接近的 2 的次方值(1 也是 2 的次方值呦)
public boolean inScaled
public int inDensity
public int inTargetDensity
這三個屬性是用來設定像素密度與縮放
如果 inScaled 是 true (預設) 且 inDensity 與 inTargetDensity 不為 0
則會依 inTargetDensity 來決定縮放比例
而若 inDensity 與 inTargetDensity 都為 0 則呼叫 decodeResource 相關的方法時會使用該 resource 原本的密度
public boolean inMutable
API 11 加入的屬性,用來設定 bitmap 是否可編輯
public Bitmap inBitmap
API 11 加入的屬性,用來改善同一個 ImageView 載入不同 bitmap 時占用太多記憶體以及 GC 的問題
圖片必須是 JPEG 或 PNG 格式
用法如下:
// 將 mBitmapOptions 跟 mCurrentBitmap 作為類別屬性以便稍後重用(bitmap 尺寸必須相同) mBitmapOptions = new BitmapFactory.Options(); mBitmapOptions.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.imageIds[0], mBitmapOptions); mCurrentBitmap = Bitmap.createBitmap(mBitmapOptions.outWidth, mBitmapOptions.outHeight, Bitmap.Config.ARGB_8888); //ARGB_8888 是 Bitmap.Config 的預設值 mBitmapOptions.inJustDecodeBounds = false; mBitmapOptions.inBitmap = mCurrentBitmap; mBitmapOptions.inSampleSize = 1; //bug, 必須設定 inSampleSize 才能 work BitmapFactory.decodeResource(getResources(), R.drawable.imageIds[0], mBitmapOptions); imageview.setImageBitmap(mCurrentBitmap);
// 換圖的demo code mcurrentIndex = (mcurrentIndex + 1) % imageIds.length; BitmapFactory.Options bitmapOptions = mBitmapOptions; bitmapOptions.inBitmap = mCurrentBitmap; // 使用 BitmapOptions.inBitmap 以重用 bitmap mCurrentBitmap = BitmapFactory.decodeResource( getResources(), imageIds[ mcurrentIndex ], bitmapOptions ); imageview.setImageBitmap( mCurrentBitmap);
相關資料:
YouTube - DevBytes: Bitmap Scaling
YouTube - DevBytes: Bitmap Allocation
developer.android.com - BitmapFactory.Options
沒有留言:
張貼留言