web-dev-qa-db-ja.com

Android Universal Image Loaderを使用してビューに表示する前に、画像のサイズを変更するにはどうすればよいですか?

ユニバーサルイメージローダーライブラリ(1.8.3バージョン)をアプリに正常に適用しました。グリッドビューアイテムに表示する前に画像のサイズを変更しようとしています(画像が大きすぎてメモリにキャッシュできない場合があるため)。

これが私が試していることです:

...
BitmapFactory.Options resizeOptions = new BitmapFactory.Options();
resizeOptions.inSampleSize = 3; // decrease size 3 times
resizeOptions.inScaled = true;

options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.blank)
.showImageForEmptyUri(R.drawable.no_image)
.cacheInMemory()
.cacheOnDisc()
.decodingOptions(resizeOptions)
.build();
...

このコードは、何らかの理由で画像を3分の1に小さくしません。

誰かが正確に指定された密度で画像のサイズを変更するより良い方法がありますか?

7
John F

Javaドキュメントを注意深く読む:

着信オプションの_Options.inSampleSize_は考慮されません。ライブラリは、imageScaleType(...)オプションに従って、最適なサンプルサイズ自体を計算します。

また、画像のターゲットサイズを定義するImageSizeUtil.defineTargetSizeForView(ImageView imageView, int maxImageWidth, int maxImageHeight)も調べてください。

サイズは、ターゲットビューのパラメーター、構成パラメーター、またはデバイスの表示サイズによって定義されます。サイズ計算アルゴリズム:

  1. ビューの実際に描画されたgetWidth()およびgetHeight()を取得します。ビューがまだ描画されていない場合は、手順2に進みます。
  2. _layout_width_および_layout_height_を取得します。両方の値が正確でない場合は、手順3に進みます。
  3. maxWidthmaxHeightを取得します。両方が設定されていない場合は、手順4に進みます。
  4. maxImageWidth param(maxImageWidthForMemoryCache)およびmaxImageHeight param(maxImageHeightForMemoryCache)を取得します。両方が設定されていない(0に等しい)場合は、手順5に進みます。
  5. デバイスの画面サイズを取得します。

UILは、imageScaleTypetargetSize(およびImageViewのscaleType)に従って結果のビットマップサイズを定義します。

22
nostra13

これを試してみてください:

options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.blank)
.showImageForEmptyUri(R.drawable.no_image)
.cacheInMemory()
.cacheOnDisc()
.decodingOptions(resizeOptions)
.postProcessor(new BitmapProcessor() {
    @Override
    public Bitmap process(Bitmap bmp) {
        return Bitmap.createScaledBitmap(bmp, 300, 300, false);
    }
})
.build();
14
Bunyod

イメージビューの高さをxmlで設定できます。あなたの画像は、言及された高さと幅に正確にフィットします。ダウンロードした画像は、xmlに記載されている高さと幅に収まります。

また、あなたと同様の問題を見ることができます。

https://github.com/nostra13/Android-Universal-Image-Loader/issues/18

2
user1604021