私のアプリには、画像付きの 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 メソッドに画像サイズを追加することもできますが、説明が必要です...