2012-08-17 18 views
32

是什麼setImageBitmapsetImageDrawable之間的區別?Android的 - 的ImageView:setImageBitmap VS setImageDrawable

我有我想從文件中動態設置的圖像。我跟着教程說以將我BitmapBitmapDrawable然後用setImageDrawable設置。我注意到,設置直接與setImageBitmapBitmap也工作,但我沒有注意到任何區別。

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
BitmapDrawable bitmapDrawable = new BitmapDrawable(image); 
imageView.setImageDrawable(bitmapDrawable); 

OR

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
imageView.setImageBitmap(image); 
+0

我覺得在這些具體的兩個例子 – 2012-08-17 07:48:09

回答

71

還有就是兩者之間沒有區別內部setImageBitmap呼籲setImageDrawable

下面的代碼是從ImageView.java拿起AOSP

public void setImageBitmap(Bitmap bm) { 
    // if this is used frequently, may handle bitmaps explicitly 
    // to reduce the intermediate drawable object 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 
+19

+1看看Android的來源沒有區別。開源的東西的好處之一。 – Jochem 2012-08-17 07:51:18

+2

區別在於新的BitmapDrawable(資源,位圖)和不贊成的構造函數新的BitmapDrawable(位圖)之間。如果您使用的是過時的佈局問題,則可能發生。 – Informatic0re 2012-12-03 14:48:00

+13

我不同意這樣的結論。有一個區別:如果你想優化一個包含圖像的列表視圖,你最好創建一個UI線程的Drawable outd,並將​​其分配給UI線程中的每個imageview。如果您使用位圖,則Drawable的創建將會減慢UI線程的速度,並且列表不會快速平滑地滾動。 – Snicolas 2014-01-08 15:50:55

4

這兩種方法是有效的,達到同樣的效果的。 在第一種方法你環繞的可繪製對象,它是任何可以在視圖中繪製的抽象您的位圖。

關於Drawables的特別之處在於它們讓你可以對它們環繞的圖形對象(縮放,平移,不透明等)進行各種操作。

位圖是一種可繪製的,你可以在這裏進一步瞭解可繪: http://developer.android.com/guide/topics/resources/drawable-resource.html

在第二種方法中,您可以直接訪問位圖位沒有任何可繪製相關的操作和簡單的繪製位圖,是在你看來。

希望這有助於歡呼聲,馬克斯。

+0

因此,對圖像執行操作是轉換爲可繪製的唯一優勢/差異?我接受了nandeesh的回答,因爲它更適合我的用法。 – meeeee 2012-08-17 08:17:27

+0

是的,基本上這是Bitmap可繪製的優點或應用。 – 2012-08-17 08:35:52

15

其實,你可以看到其中的差別,如果你有時使用null作爲參數:

imageView.setImageDrawable(null); 
Drawable d = imageView.getDrawable(); // d == null 

imageView.setImageBitmap(null); 
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null 

所以如果你是在ImageView檢查被拉伸的存在,它的提防。

+1

這是最重要的區別,謝謝。我喜歡使用ImageView的邏輯來檢查它是否已設置,所以這很好。 – AutoM8R 2014-08-04 20:31:14

0
public void setImageBitmap(Bitmap bm) { 
// if this is used frequently, may handle bitmaps explicitly 
// to reduce the intermediate drawable object 
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

也許不同的是mContext.getResources(),從mContext.getResources() 可以得到divice的密度,所以在sceen顯示的是不同的

8

我剛寫了一個文章爲了這。希望能夠回答你的問題。

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView有4個API來指定該圖像。哪一個使用?有什麼不同?

  1. setImageDrawable(可繪製可繪製的)
  2. setImageBitmap(位圖BM)
  3. setImageResource(INT渣油)
  4. setImageURI(URI URI)

ImageView,由名稱,是用來顯示圖像。但是什麼是圖像?一個Bitmap是 - 一個圖像,不難理解,我們使用setImageBitmap爲此目的。但是,在內部,ImageView有-但不是Bitmap,這就是setImageDrawable。當您在內部調用setImageBitmap時,首先將位圖包裝爲BitmapDrawable,即IS-A Drawable,然後調用setImageDrawable

這是代碼。

public void setImageBitmap(Bitmap bm) { 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

那麼,3和4 API呢?

您應該已經知道,這是一種創建位圖的方式:從文件路徑,從輸入流,從Uri或從資源文件。

BitmapFactory.decodeFile(String pathName) 
BitmapFactory.decodeStream(Inputstream) 
BitmapFactory.decodeResource(Resource res, int id) 
BitmapFactory.decodeByteArray(byte[] data) 

意識到這一點,這是很容易理解setImageResource/setImageUri只是同setImageBitmap

總結,setImageDrawable是其他API依賴的原始函數。其他3個只是幫你編寫少量代碼的方法。

此外,請務必記住,ImageView實際上有-,但不一定是BitmapDrawable!您可以將任何Drawable設置爲圖像視圖。

除了設置Drawable通過Java API,你也可以使用XML屬性設置源DrawableImageView。看下面的例子。請注意,形狀可以是圖像文件(.png,.jpg,.bmp)或xml文件。

+0

但是哪個API調用更快? 'setImageDrawable'似乎是最快的,但其他的呢? – winklerrr 2017-01-24 12:56:39

相關問題