5

特定の画像をプリロードすると、アプリケーションで有利になります。公式ドキュメントに書かれているように、AsyncTaskでこれを正しく行います。しかし、いつ設定すべきかについて問題/質問があります。

コードスニペットを表示します。単純化されていることに注意してください(実際のコードでは相互運用性が優れており、nullなどをチェックします)。

最初に元の(プリロードされていない)バージョンを見てみましょう。

<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(...)が呼び出される前に画像を認識しています。プリロードバージョンは、その呼び出しの後にイメージを設定します。違いはありますか?これにより、システムによって実行される自動スケーリングやその他の処理をスキップできますか?

4

2 に答える 2

4

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

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 ファイルのいずれかであることに注意してください。

<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>
于 2013-09-09T08:36:16.510 に答える
3

まったく違いはありません。ImageViewコンストラクターがandroid:src属性に対して行うのはcallだけであると考えることができますsetImageResource

更新:実際にはを使用します。これは、属性を取得するコンストラクターsetImageDrawableの実際のコードです。ImageView

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

参照:ImageView.java

于 2012-06-10T20:43:41.793 に答える