0

画像のセットを水平ビューページャーに表示したい.Universal Image Loaderを使用しました.すべて問題ありません.しかし、ズームした後、大きな画像であっても画像の品質が失われます.

画像のサイズは 1000*1000 です

私は次の設定で構成しました

Options options = new DisplayImageOptions.Builder()
        .showImageForEmptyUri(R.drawable.ic_launcher)
        .cacheOnDisc()
        .cacheInMemory()
        .imageScaleType(ImageScaleType.POWER_OF_2)
        .build();

config = new ImageLoaderConfiguration.Builder(ctx)
        .defaultDisplayImageOptions(options)
        .build();
ImageLoader.getInstance().init(config);
4

1 に答える 1

6

Universal Image Loader は、メモリを節約するために縮小された画像をメモリに保持します。すべての縮小画像のサイズが計算され、この画像のターゲット ImageView に依存します ( android:layout_widthandroid:layout_heightandroid:maxWidthandroid:maxHeightパラメーター、android:scaleType、デバイスの画面サイズが考慮されます)。

デフォルトでは、すべての画像の最大ターゲット サイズはデバイスの画面サイズです。そのため、デバイスの画面サイズに似たサイズの画像があり、ズームすると品質が低下します。

そのため、ImageView フルサイズの画像をロードする必要があります (品質を損なうことなくズームをサポートするため)。 メモリにキャッシュされた画像の独自の最大サイズを設定します

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
        ...
        .memoryCacheExtraOptions(1200, 1000) // maximum width and height of your images
        ...
        .build();

この場合、大きなビットマップをメモリにロードするので、メモリにキャッシュしないことをお勧めします.cachenMemory()これらの画像のメモリ キャッシュを無効にし (DisplayImageOptions で呼び出さないでください)、 を設定し.imageScaleType(ImageScaleType.EXACT)ます。.defaultDisplayImageOptions(...)それらをグローバルに ( で)、または表示タスクごとに ( imageLoader.displayImage(...))無効にすることができます。

OOM を防止するには:

  1. .cachenMemory()これらの画像のメモリ キャッシュを無効にします ( DisplayImageOptionsを呼び出さないでください)。
  2. 設定.imageScaleType(ImageScaleType.EXACT)
  3. 設定.threadPoolSize(1)(最後の試行として)
  4. アダプタのビットマップをリサイクル:

    private class ImagePagerAdapter extends PagerAdapter {
        ...
        @Override
            public void destroyItem(View container, int position, Object object) {
            View view = (View) object;
            ((ViewPager) container).removeView(view);
            ImageView imageView = (ImageView) view.findViewById(R.id.image);
            BitmapDrawable bd = (BitmapDrawable) imageView.getDrawable();
            if (bd != null) {
                Bitmap bmp = bd.getBitmap();
                if (bmp != null) {
                    bmp.recycle();
                }
            }
        }
        ...
    }
    
于 2012-09-28T10:27:13.653 に答える