42

setImageBitmapとはどう違いsetImageDrawableますか?

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

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

また

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

5 に答える 5

80

setImageBitmap内部的に呼び出している 2 つの違いはありませんsetImageDrawable

以下のコードは、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));
}
于 2012-08-17T07:48:03.747 に答える
18

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

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

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

でドローアブルの存在を確認している場合はImageView、注意してください。

于 2012-12-14T13:51:10.983 に答える
13

これだけのために記事を書きました。あなたの質問に答えられることを望みます。

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

ImageView画像を指定するための 4 つの API があります。どちらを使用しますか?違いはなんですか?

  1. setImageDrawable(ドローアブル ドローアブル)
  2. setImageBitmap(ビットマップ bm)
  3. setImageResource(int resId)
  4. setImageURI(URI uri)

ImageViewという名前で、画像を表示するために使用されます。しかし、イメージとは何ですか?ABitmapはイメージであり、理解するのが難しくなくsetImageBitmap、その目的のために使用します。ただし、内部的には、ImageViewhas-aDrawableではなく、BitmapそれがsetImageDrawable目的です。内部でを呼び出すと、最初にビットマップがIS-AsetImageBitmapにラップされ、次に が呼び出されます。BitmapDrawableDrawablesetImageDrawable

これがコードです。

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実際には がありDrawable、必ずしもBitmapDrawable!であるとは限らないことに注意してください。Drawable画像ビューにはどれでも設定できます。

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

于 2013-09-09T08:39:20.667 に答える
4

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

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

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

2 番目の方法では、ドローアブル関連の操作を行わずにビットマップ ビットに直接アクセスし、ビットマップをそのままビューに描画します。

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

于 2012-08-17T07:54:48.440 に答える
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() からデバイスの密度を取得できるため、画面上の表示が異なります

于 2013-03-11T06:58:34.057 に答える