web-dev-qa-db-ja.com

Android-ImageView:setImageBitmap VS setImageDrawable

setImageBitmapsetImageDrawableの違いは何ですか?

ファイルから動的に設定したい画像があります。私が従ったチュートリアルでは、BitmapBitmapDrawableに変換し、setImageDrawableを使用して設定するように指示しています。 BitmapsetImageBitmapで直接設定することもできますが、違いはわかりません。

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

OR

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
37
meeeee

内部的にsetImageBitmapsetImageDrawableを呼び出している2つの間に違いはありません。

以下のコードは、AOSPのImageView.Javaから選択されています

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

実際、nullを引数として使用する場合は、違いがわかる場合があります。

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

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

そのため、ImageViewにドロウアブルの存在をチェックしている場合は、注意してください。

17
Fenix Voltres

この記事を書きました。あなたの質問に答えられるようになりたい。

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

ImageViewには、イメージを指定するための4つのAPIがあります。どちらを使用しますか?違いはなんですか?

  1. setImageDrawable(Drawable drawable)
  2. setImageBitmap(ビットマップbm)
  3. setImageResource(int resId)
  4. setImageURI(URI uri)

名前によるImageViewは、画像の表示に使用されます。しかし、画像とは何ですか? Bitmapは画像であり、理解するのは難しくありません。そのためにsetImageBitmapを使用します。ただし、内部的には、ImageViewDrawableではなく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/setImageUrisetImageBitmapと同じであることが簡単に理解できます。

要約すると、setImageDrawableは他のAPIが依存するプリミティブ関数です。他の3つは、より少ないコードを記述するヘルパーメソッドです。

さらに、ImageViewには実際にはDrawableがありますが、これは必ずしもBitmapDrawableである必要はありません。任意のDrawableを画像ビューに設定できます。

Java API)を介してDrawableを設定する以外に、XML属性を使用してDrawableのソースImageViewを設定することもできます。以下の例を参照してください。形状は、画像ファイル(.png、.jpg、.bmp)またはxmlファイルのいずれかである可能性があることに注意してください。

11
pierrotlefou

どちらの方法も有効であり、同じ結果が得られます。最初の方法では、ビューで描画できるものの抽象化である描画可能なオブジェクトの周りにビットマップをラップします。

Drawableの特別な点は、ラップするグラフィックオブジェクトに対してあらゆる種類の操作(スケーリング、変換、不透明度など)を実行できることです。

ビットマップはドロウアブルの一種です。ドロウアブルの詳細については、こちらをご覧ください: http://developer.Android.com/guide/topics/resources/drawable-resource.html

2番目の方法では、描画可能な関連操作なしでビットマップビットに直接アクセスし、ビューにビットマップをそのまま描画します。

これがお役に立てば幸いです、マックス。

4
Max Raskin
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()であり、デバイスの密度を取得できるため、画面上の表示は異なります

0
lemon