通用图片加载器roundedBitmapDisplayer问题

14

我正在使用最新的universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar文件,它运行良好。我想将图像更改为圆形(圆形)。我已经使用了以下显示选项。

             DisplayImageOptions userimgoptions = new DisplayImageOptions.Builder()
                           .displayer(new RoundedBitmapDisplayer(35))
                           .showImageOnLoading(android.R.color.transparent)
                           .showImageForEmptyUri(R.drawable.picture_info_profile_img)
                           .showImageOnFail(R.drawable.picture_info_profile_img)
                           .cacheInMemory(true).cacheOnDisc(true)
                           .bitmapConfig(Bitmap.Config.RGB_565).build();

有些图片无法正常工作。我已经测试过它在低分辨率和高分辨率下都无法工作。

注意:我的xml中ImageView的高度和宽度为(55 * 55)。

输入图像描述 输入图像描述 输入图像描述 输入图像描述

请帮助我解决这个问题。我无法解决这个问题。

谢谢。


在那个库中,它提供了用于显示圆形位图的属性。你有检查过吗? - Piyush
6个回答

19
如果你想要一个圆形的图片,你可以将 .displayer(new RoundedBitmapDisplayer(25)) 改为 .displayer(new RoundedBitmapDisplayer(1000)),这对我有效。

10

如果您想要一个圆形的图片,您需要将圆形位图显示器设置为图片的半径,而在您的情况下,半径为1/2 55或27.5

DisplayImageOptions userimgoptions = new DisplayImageOptions.Builder()
                       .displayer(new RoundedBitmapDisplayer((int) 27.5f))
                       .showImageOnLoading(android.R.color.transparent)
                       .showImageForEmptyUri(R.drawable.picture_info_profile_img)
                       .showImageOnFail(R.drawable.picture_info_profile_img)
                       .cacheInMemory(true).cacheOnDisc(true)
                       .bitmapConfig(Bitmap.Config.RGB_565).build();

但是将其硬编码可能不是一个好主意,当您实际获得位图并计算宽度时,建议更改配置。


我从API获取到了120*120像素的图像。所有的图像都将是相同的尺寸。 - Murali Ganesan
然后将圆角位图显示器设置为60。如果您想在任何地方使用圆形图像,则边框大小将仅为半径。 - Brian

7

我发现即使使用最新的重写,RoundedBitmpDisplayer仍然非常慢。到目前为止,我发现始终获得圆角的最快方法是使用RoundedImageView。https://github.com/vinc3m1/RoundedImageView您可以将该视图传递给UIL,视图将为您处理圆角。您只需指定所需的半径。


4

就像kingargyle所说,使用RoundedImageView是最好的方法,你可以通过执行以下操作来实现你想要的效果:

Transformation transformation = new RoundedTransformationBuilder()
          .borderColor(Color.BLACK)
          .borderWidthDp(3)
          .cornerRadiusDp(30)
          .oval(false)
          .build();

Picasso.with(context)
    .load(url)
    .fit()
    .transform(transformation)
    .into(imageView);

因此,如果您不需要定制很多缓存选项,则使用 Picasso 而不是 Universal Image Loader 与 RoundedImageView 是最佳选择。


在“that iRadiusDp”中应该有一个空格吗?它说找不到该方法。 - Pat Myron
1
@PatMyron 这个方法是cornerRadiusDp。我不记得为什么写成“iRadiusDp”了。 - GuilhE

1
Tim的解决方案很好,但在我的情况下,如果图像越大,则图像比圆形更椭圆。 尝试使用此代码,它适用于任何图像大小:
public class CircleBitmapDisplayer extends RoundedBitmapDisplayer {


public CircleBitmapDisplayer() {
    super(0);
}

@Override
public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
    if (!(imageAware instanceof ImageViewAware)) {
        throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
    }

    imageAware.setImageDrawable(new CircleDrawable(bitmap, margin));
}

public static class CircleDrawable extends RoundedDrawable {

    private Bitmap mBitmap;

    public CircleDrawable(Bitmap bitmap, int margin) {
        super(bitmap, 0, margin);
        this.mBitmap = bitmap;
    }

    @Override
    public void draw(Canvas canvas) {
        int radius = 0;
        if(mBitmap.getWidth() > mBitmap.getHeight()) {
            radius = mBitmap.getHeight() / 2;
        }else {
            radius = mBitmap.getWidth() / 2;
        }
        canvas.drawRoundRect(mRect, radius, radius, paint);
    }
}
}

将其视为普通显示器使用:
DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .displayer(new CircleBitmapDisplayer())
                    .cacheInMemory(true)
                    .cacheOnDisk(true)
                    .build();
ImageLoader.getInstance().displayImage(url, imageView,options);

0

在DisplayImageOptions中使用.displayer(new CircleBitmapDisplayer())

以及

compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

在你的模块级别的 build.gradle 文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接