2012-08-17 4 views
32

setImageBitmapsetImageDrawableの違いは何ですか?Android - ImageView:setImageBitmap VS setImageDrawable

ファイルから動的に設定したい画像があります。私が従ったチュートリアルではBitmapBitmapDrawableに変換し、次にsetImageDrawableを使用して設定します。私はsetImageBitmapで直接Bitmapを設定しても動作することに気付きましたが、私は何の違いに気付かないのです。

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

私はAndroidのソースを見ているため、これらの具体的な二つの例 –

答えて

71

内部で2 setImageBitmapの間に違いはありませんsetImageDrawableを呼んでいます。コードの下

どちらの方法が有効で、同じ結果を達成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に差を考えていません。オープンソースのメリットの1つ。 – Jochem

+2

新しいBitmapDrawable(Resource、Bitmap)と非推奨のコンストラクタ、新しいBitmapDrawable(Bitmap)の違いがあります。廃止予定のものを使用している場合、レイアウトの問題が発生する可能性があります。 – Informatic0re

+13

私は結論には同意しません。違いがあります。たとえば、リストビューをイメージで最適化する場合は、UIスレッドのDrawableの外部を作成し、UIスレッドの各イメージビューに割り当てる方がよいでしょう。ビットマップを使用すると、Drawableを作成するとUIスレッドが遅くなり、リストがスムーズかつスムーズにスクロールしなくなります。 – Snicolas

4

ImageView.javaから選ばれます。 最初の方法では、描画可能オブジェクトの周りにビットマップをラップします。これは、ビューに描画できるものの抽象です。

Drawablesに関する特別なことは、それらがラップアラウンドしているグラフィックオブジェクト(スケーリング、翻訳、不透明度など)であらゆる種類の操作を実行できることです。

ビットマップが描画可能なの一種である、あなたはここでドローアブルについてさらに学ぶことができます。 http://developer.android.com/guide/topics/resources/drawable-resource.html

を第二の方法では、あなたが直接、任意の描画可能な関連の操作なしに、ビットマップ・ビットにアクセスし、-があるとして、単純にビットマップを描きますあなたの意見で

これがうまくいくことを願っています。あなたは時々、引数としてnullを使用する場合

+0

イメージ上で操作を実行することは、ドロウアブルに変換する唯一の利点/違いですか?私はそれが私の用法にもっと適用できるので、nandeeshの答えを受け入れました。 – meeeee

+0

ええ、本質的にこれは、ビットマップドロワブルの利点またはむしろ適用です。 –

15

実際に、あなたは、違いが表示されることがあります

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

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

ので、あなたがImageViewで描画可能の有無をチェックしている場合、それは注意してください。

+1

これは最も重要な違いです。ありがとうございます。私はそれが設定されているかどうかを確認するために、ImageViewのロジックを使用するのが好きなので、これは素晴らしいです。 – AutoM8R

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)); 
} 

は多分違いはdiviceの密度を得ることができますmContext.getResources() からmContext.getResourcesを()、であるので、私はちょうど記事を書いた

8

sceen上の表示が異なっていますこのため。あなたの質問に答えることができれば幸いです。

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

ImageView画像を指定する4つのAPIを有します。どちらを使うの?違いはなんですか?

  1. setImageDrawable(描画領域描画可能)
  2. setImageBitmap(ビットマップBM)
  3. setImageResource(INT残油)
  4. setImageURI(URI URI)

ImageView、名前によって、するために使用され画像を表示する。しかし、イメージとは何ですか? A Bitmapは画像であり、わかりにくいわけではありません。そのためにsetImageBitmapを使用しています。ただし、内部では、ImageViewは-Drawableですが、Bitmapはありません。それはsetImageDrawableです。 setImageBitmapを呼び出すと、内部的に最初にビットマップがBitmapDrawable(これはIS-A Drawable)にラップされ、その後setImageDrawableにコールされます。

ここにコードがあります。

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

3 APIと4 APIについてはどうですか?ウリから、またはリソースファイルから、入力ストリームから、ファイルパスから:

あなたは既にビットマップを作成する方法の束があるということを知っている必要があります。このことを認識して

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

は、setImageResource/setImageUrisetImageBitmapとしてちょうど同じであることを理解しやすいです。

まとめると、setImageDrawableは、他のAPIが依存する基本関数です。他の3つはちょうどあなたがコードを書くのを助けるヘルパーメソッドです。また

、必ずしもBitmapDrawableすべき、ImageViewが実際に持っている、というDrawableを心に留めておくことが非常に重要です!任意のDrawableを画像ビューに設定することができます。

Java APIを使用してDrawableを設定する以外にも、XML属性を使用してをImageViewに設定することもできます。以下の例を参照してください。シェイプはイメージファイル(.png、.jpg、.bmp)またはxmlファイルのいずれかになります。

+0

しかし、どのAPI呼び出しが高速ですか? 'setImageDrawable'が最も速いようですが、他のものは何ですか? – winklerrr

関連する問題