简体   繁体   English

在Android中使用Universal Image Loader缩放后,imageview模糊

[英]Blurred imageview after zooming while using Universal Image Loader in android

I want to display set of images in horizontal viewpager .I have used the Universal Image Loader Everything is fine.But after zooming, quality of images have lost even for big images. 我想在水平viewpager中显示一组图像。我使用了通用图像加载器,一切都很好。但是缩放后,即使是大图像,图像的质量也会下降。

The Size of image is 1000*1000 图片尺寸为1000 * 1000

I have configured with the following settings 我已经配置了以下设置

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);

Universal Image Loader keeps reduced images in memory to save memory. 通用图像加载器可将减少的图像保留在内存中以节省内存。 Size of every reduced image is calculated and it depends on target ImageView for this image ( android:layout_width , android:layout_height , android:maxWidth , android:maxHeight parameters, android:scaleType , device screen size are considered). 计算每个缩小图像的大小,并取决于该图像的目标ImageView(考虑android:layout_widthandroid:layout_heightandroid:maxWidthandroid:maxHeight参数, android:scaleType ,设备屏幕尺寸)。

By default maximum target size for every image is device's screen size. 默认情况下,每个图像的最大目标大小是设备的屏幕大小。 So you have images of size similar to device screen size and when you zooming you see bad quality. 因此,您获得的图像大小与设备屏幕大小相似,并且在缩放时会看到质量差的图像。

So you should load in ImageView full-sized images (for zooming support without quality loss). 因此,您应该在ImageView中加载完整尺寸的图像(以实现缩放支持,而不会降低质量)。 Set your own maximum size for cached images in memory : 为内存中的缓存图像设置自己的最大大小

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

In this case you will load large Bitmaps in memory so I recommend not to cache them in memory . 在这种情况下,您将在内存中加载大的位图,因此我建议不要在内存中缓存它们 Disable memory caching for these images (don't call .cachenMemory() in DisplayImageOptions) and set .imageScaleType(ImageScaleType.EXACT) . 禁用这些图像的内存缓存(不要在DisplayImageOptions中调用.cachenMemory() )并设置.imageScaleType(ImageScaleType.EXACT) You can disable them globally (in .defaultDisplayImageOptions(...) ) or for every display task ( imageLoader.displayImage(...) ) 您可以全局禁用它们(在.defaultDisplayImageOptions(...) ),也可以针对每个显示任务禁用它们( imageLoader.displayImage(...)

TO PREVENT OOM: 预防OOM:

  1. Disable memory caching for these images (don't call .cachenMemory() in DisplayImageOptions) 禁用这些图像的内存缓存(不要在DisplayImageOptions中调用.cachenMemory()
  2. Set .imageScaleType(ImageScaleType.EXACT) 设置.imageScaleType(ImageScaleType.EXACT)
  3. Set .threadPoolSize(1) (as last try) 设置.threadPoolSize(1) (最后一次尝试)
  4. Recycle Bitmaps in adapter: 回收适配器中的位图:

     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(); } } } ... } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM