web-dev-qa-db-ja.com

ユニバーサルイメージローダーroundedBitmapDisplayerの問題

最新のuniversal-image-loader-1.9.2-SNAPSHOT-with-sources.jarファイルを使用しています。その正常に動作します。画像をround(Circle)に変更したいです。以下の表示オプションを使用しました。

             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の高さとwith(55 * 55)

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

この問題を解決する方法を教えてください。この問題を解決できません。

ありがとう、

14
Murali Ganesan

円形の画像が必要な場合は、.displayer(new RoundedBitmapDisplayer(25)).displayer(new RoundedBitmapDisplayer(1000))に変更できます。

19
timbillstrom

丸みを帯びた画像が必要な場合は、丸みを帯びたビットマップ表示を画像の半径に設定する必要があります。この場合、1/255または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();

しかし、それをハードコーディングするのはおそらく良い考えではありません。実際にビットマップを取得して幅を計算するときに構成を変更します。

10
Brian

RoundedBitmpDisplayerは、最新の書き換えを行ってもかなり遅いことがわかりました。丸みを帯びた角を一貫して取得するために私が見つけた最も速い方法は、RoundedImageViewを使用することです。 https://github.com/vinc3m1/RoundedImageView そのビューをUILに渡すと、ビューが角を丸めてくれます。必要な半径を指定するだけです。

7
kingargyle

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

したがって、多くのキャッシュオプションをコスト計算する必要がない場合は、Universal Image Loaderの代わりにPicassoを使用してRoundedImageViewこれが最良のオプションです。

4
GuilhE

ティムの解決策は良いですが、私の場合、画像が大きくて背が高い場合、画像は円よりも楕円形になります。このコードを試してください。すべての画像サイズで機能します。

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

DisplayImageOptionsで.displayer(new CircleBitmapDisplayer())を使用します

に加えて

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

モジュールレベルのbuild.gradleで。

0
divonas