我有一个应用程序要求我的图像是圆形的。原始图像是正方形或矩形。此图像来自服务器。我检索这些图像,然后将其设置在我的 7 个应该是圆形的图像的图像视图中。
我使用通用图像加载器来加载我的图像。
这是对我的图像进行四舍五入的方法。
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
所以在onLoadingComplete()
UniversalImageLoader 中,我这样做了imageView.setImageBitMap(getRoundedCornerBitmap(bitmap, pixel))
它工作正常,但有时我会得到OutofMemoryError
。我在Android-Universal-Image-Loader (github) 中找到了。
Avoid using RoundedBitmapDisplayer. It creates new Bitmap object with ARGB_8888 config for displaying during work.
有没有另一种方法来实现图像的舍入而不必遭受 OutOfMemoryError?
任何帮助是极大的赞赏。
[更新]:这就是我配置 ImageLoader 的方式。
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).denyCacheImageMultipleSizesInMemory()
.memoryCache(new WeakMemoryCache())
.discCache(new UnlimitedDiscCache(cacheDir))
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.defaultDisplayImageOptions(
new DisplayImageOptions.Builder()
.showStubImage(R.drawable.default_user)
.resetViewBeforeLoading()
.cacheOnDisc()
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.build())
.tasksProcessingOrder(QueueProcessingType.FIFO)
.imageDownloader(new HttpClientImageDownloader(context, new DefaultHttpClient(manager, params)))
.threadPoolSize(2)
.build();
// Initialize ImageLoader with created configuration.
imageLoader.init(config);