Универсальный загрузчик изображений roundedBitmapDisplayer

Я использую последний файл 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 и с (55 * 55).

enter image description hereenter image description hereenter image description hereenter image description here

пожалуйста, любезно помогите мне, как решить эту проблему. я не могу решить эту проблему.

Спасибо,

Ответ 1

Если вы хотите круговое изображение, вы можете изменить .displayer(new RoundedBitmapDisplayer(25)) на .displayer(new RoundedBitmapDisplayer(1000)), который работал у меня.

Ответ 2

Если вам нужно закругленное изображение, вам нужно установить округленный растровый дисплей в радиус изображения, которое в вашем случае равно 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();

Но, вероятно, это не очень хорошая идея для жесткого кода, я бы изменил конфигурацию, когда вы действительно получите растровое изображение и вычислите ширину.

Ответ 3

Я нашел 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, это лучший вариант.

Ответ 5

Решение Тима хорошее, но в моем случае, если изображение больше, чем выше, изображение более овальное, чем круг. Попробуйте этот код, он работает с каждым размером изображения:

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

Ответ 6

Используйте .displayer(new CircleBitmapDisplayer()) в DisplayImageOptions

вместе с

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

в вашем модульном уровне build.gradle.