2012-06-10 31 views
4

在我的應用程序中,如果預先加載某些圖像是有利的。我在AsyncTask中正確執行此操作,因爲它是在官方文檔中編寫的。但是我有一個關於何時應該設置的問題/問題。XML與setImageDrawable/setImageBitmap

我會顯示代碼片段。請注意,它是簡化的(它們的互操作性在我的真實代碼中更好,它檢查空值等)。

讓我們看到原來的(非預裝)版第一:

<ImageView 
    android:id="@+id/imageViewMyGraphicalImageElement" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="centerCrop" 
    android:src="@drawable/my_graphical_element" > 
</ImageView> 

預裝的版本具有以下XML(注意,src屬性丟失):

<ImageView 
    android:id="@+id/imageViewMyGraphicalImageElement" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="centerCrop"> 
</ImageView> 

而且一個片段從預加載代碼:

sBitmap = bitmapBitmapFactory.decodeResource(context.getResources(), R.drawable.my_graphical_element, options); 
// 'sBitmap' is a Bitmap reference, while 'options' is BitmapFactory.Options 

最後,我設置它的地方:

setContentView(R.layout.main); 
... 
ImageView imageViewMyGraphicalImageElement= (ImageView) findViewById(R.id.imageViewMyGraphicalImageElement); 
imageViewMyGraphicalImageElement.setImageBitmap(sBitmap); 

問: 顯然,基於XML的解決方案知道之前的setContentView圖像(...)被調用。預加載版本在調用之後設置圖像。有什麼區別嗎?由於這個原因,系統可能會跳過一些自動縮放或其他事情嗎?

回答

3

完全沒有區別。你可以認爲所有ImageView構造函數的android:src屬性都是調用setImageResource

更新:其實它使用setImageDrawable,這是ImageView構造服用屬性的實際代碼:

Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src); 
    if (d != null) { 
     setImageDrawable(d); 
    } 

參考:ImageView.java

+0

我明白了,但在我的代碼不同的是,ImageView的構造函數(即**基於XML的解決方案**)之前被調用(或過程?)的setContentView。在編程解決方案中,我在** setContentView()之後調用setImageDrawable(或setImageBitmap - 都適用於我)**。 我知道Android會自動縮放和其他東西與位圖和佈局,所以我只是想知道哪些被跳過,因爲對setImageDrawable/setImageBitmap的晚調用。 –

+0

@Thomas Calc:如果您檢查代碼,您會看到所有'setImage'變體都自己執行_auto縮放和其他stuff_。沒有功能會被跳過。 –

3

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

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設置爲圖像視圖。

除了通過Java API設置Drawable之外,您還可以使用XML歸屬來設置源DrawableImageView。見下面的例子。請注意,形狀可以是圖像文件(.png,.jpg,.bmp)或xml文件。

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="50dip" 
    android:src="@drawable/shape"/> 

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="270"/> 
    <padding android:left="7dp" android:top="7dp android:right="7dp" android:bottom="7dp" /> 
    <corners android:radius="8dp" /> 
</shape> 
+0

@nhahtdh,感謝您清理格式並使其更具可讀性! – pierrotlefou