1

私のアプリには、画像付きの ListView があります。Universal Image Loader (1.7.0) を使用してインターネットから画像を読み込みます。

構成と表示オプション:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory()
                .cacheOnDisc()
                .build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
                .defaultDisplayImageOptions(defaultOptions)
                .threadPoolSize(2)
                .enableLogging()
                .build();

getView () の一部(私のアプリは ConvertView を再利用し、ViewHolder パターンを使用します):

View rowView = convertView;

ViewHolder holder;

if (rowView == null) {
    LayoutInflater inflater = activity.getLayoutInflater();
    rowView = inflater.inflate(R.layout.list_row, null, true);
    holder = new ViewHolder();
    holder.photoView = (ImageView) rowView.findViewById(R.id.list_photo_view);

    rowView.setTag(holder);
} else {
    holder = (ViewHolder) rowView.getTag();
}
String photoUrl = "http://someserver.com/some_image.jpg";
mImageLoader.displayImage(photoUrl, holder.photoView);

list_row.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:clickable="true" >

    <ImageView
        android:id="@+id/list_photo_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="false"
        android:contentDescription="@string/photo"
        android:scaleType="centerInside"
        android:src="@drawable/template_image_list" />

</LinearLayout>

もちろん、ImageView は各行の単一のビューではありません。それは短いバージョンです:)。インターネットからダウンロードした画像のサイズは450x337です。画面サイズが 1280x760 のタブレットでアプリをテストしています。

ロギングを有効にすると、次のようなメッセージが表示されます。

Load image from memory cache [http://someserver.com/some_image.jpg_1280x736]

など... URLの末尾が「_1280x736」と少し混乱しています。マニュアルの2番目の部分が言うように:

• maxImageWidthForMemoryCache() および maxImageHeightForMemoryCache() は、イメージを Bitmap オブジェクトにデコードするために使用されます。フルサイズの画像をメモリに保存しないために、画像が読み込まれる ImageView パラメーターの値から決定されるサイズに縮小されます: maxWidth と maxHeight (第 1 段階)、layout_width と layout_height (第 2 段階)。これらのパラメーターが定義されていない場合 (値 fill_parent および wrap_content は不確実と見なされます)、設定 maxImageWidthForMemoryCache() および maxImageHeightForMemoryCache() によって指定された寸法が使用されます。幅または高さが指定された値よりも小さくなるまで、元の画像のサイズが 2 倍に縮小されます (高速デコードに推奨)。o デフォルト値 - デバイスの画面のサイズ。

したがって、私が理解しているように、このエンディングは「縮小」後のメモリキャッシュ内の画像のサイズです:)そして画像ローダーはデフォルト値(画面のサイズ)を使用していました。画像ローダーが ImageView のサイズを取得できなかったことに驚きはありませんが (早すぎる可能性があります)、元の画像が拡大されたのはなぜですか? 元の画像のサイズを確認してそのままにしておくのは難しいですか? もちろん、displayImage メソッドに画像サイズを追加することもできますが、説明が必要です...

4

1 に答える 1

2

素敵な詳細な質問。

"_1280x736"のような URL の末尾は、結果のビットマップのサイズを意味するものではありません。元の画像を縮小するターゲットサイズです。あなたの場合、それはデバイスの画面サイズに等しく、元の画像(このターゲットサイズよりも小さい)はスケーリングされません(ImageScaleType.EXACTLY_STRETCHED表示オプションで設定するまで)。

心配しないでください。ランタイムで実際のビットマップ サイズが表示される場合は、元の画像サイズが表示されます (1280x736 ではありません)。

于 2012-12-17T18:37:01.380 に答える