Bal*_*ran 0 android image-processing universal-image-loader
我想在水平viewpager中显示一组图像.我使用了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);
Run Code Online (Sandbox Code Playgroud)
Universal Image Loader将缩小的图像保存在内存中以节省内存.每个缩小图像的尺寸被计算,它依赖于目标的ImageView为这个图象(android:layout_width,android:layout_height,android:maxWidth,android:maxHeight参数,android:scaleType,设备的屏幕大小被认为是).
默认情况下,每个图像的最大目标大小是设备的屏幕大小.所以你有大小类似于设备屏幕尺寸的图像,当你缩放时,你看到质量差.
因此,您应该加载ImageView全尺寸图像(用于缩放支持而不会丢失质量). 为内存中的缓存图像设置自己的最大大小:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
...
.memoryCacheExtraOptions(1200, 1000) // maximum width and height of your images
...
.build();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您将在内存中加载大型位图,因此我建议不要将它们缓存在内存中.禁用这些图像的内存缓存(不要.cachenMemory()在DisplayImageOptions中调用)并进行设置.imageScaleType(ImageScaleType.EXACT).您可以全局(in .defaultDisplayImageOptions(...))或为每个显示任务(imageLoader.displayImage(...))禁用它们
防止OOM:
.cachenMemory()在DisplayImageOptions中调用).imageScaleType(ImageScaleType.EXACT).threadPoolSize(1)(如上次尝试)在适配器中回收位图:
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();
}
}
}
...
}
Run Code Online (Sandbox Code Playgroud)