setImageBitmap
とsetImageDrawable
の違いは何ですか?
ファイルから動的に設定したい画像があります。私が従ったチュートリアルでは、Bitmap
をBitmapDrawable
に変換し、setImageDrawable
を使用して設定するように指示しています。 Bitmap
をsetImageBitmap
で直接設定することもできますが、違いはわかりません。
Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
BitmapDrawable bitmapDrawable = new BitmapDrawable(image);
imageView.setImageDrawable(bitmapDrawable);
OR
Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
内部的にsetImageBitmap
がsetImageDrawable
を呼び出している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));
}
実際、null
を引数として使用する場合は、違いがわかる場合があります。
imageView.setImageDrawable(null);
Drawable d = imageView.getDrawable(); // d == null
imageView.setImageBitmap(null);
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null
そのため、ImageView
にドロウアブルの存在をチェックしている場合は、注意してください。
この記事を書きました。あなたの質問に答えられるようになりたい。
https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw
ImageView
には、イメージを指定するための4つのAPIがあります。どちらを使用しますか?違いはなんですか?
名前によるImageView
は、画像の表示に使用されます。しかし、画像とは何ですか? Bitmap
は画像であり、理解するのは難しくありません。そのためにsetImageBitmap
を使用します。ただし、内部的には、ImageView
はDrawable
ではなく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
には実際にはDrawable
がありますが、これは必ずしもBitmapDrawable
である必要はありません。任意のDrawable
を画像ビューに設定できます。
Java API)を介してDrawable
を設定する以外に、XML属性を使用してDrawable
のソースImageView
を設定することもできます。以下の例を参照してください。形状は、画像ファイル(.png、.jpg、.bmp)またはxmlファイルのいずれかである可能性があることに注意してください。
どちらの方法も有効であり、同じ結果が得られます。最初の方法では、ビューで描画できるものの抽象化である描画可能なオブジェクトの周りにビットマップをラップします。
Drawableの特別な点は、ラップするグラフィックオブジェクトに対してあらゆる種類の操作(スケーリング、変換、不透明度など)を実行できることです。
ビットマップはドロウアブルの一種です。ドロウアブルの詳細については、こちらをご覧ください: http://developer.Android.com/guide/topics/resources/drawable-resource.html
2番目の方法では、描画可能な関連操作なしでビットマップビットに直接アクセスし、ビューにビットマップをそのまま描画します。
これがお役に立てば幸いです、マックス。
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()であり、デバイスの密度を取得できるため、画面上の表示は異なります