2014-02-06 2 views
12

Ich verwende neueste Universal-Image-Loader-1.9.2-SNAPSHOT-with-sources.jar-Datei. Es funktioniert gut. Ich möchte das Bild in eine runde Form umwandeln (Kreis). Ich habe folgende Anzeigeoptionen verwendet.Universal Image Loader gerundet BitmapDisplayer Ausgaben

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

seine nicht für einige Bilder arbeiten. Ich habe dies in niedriger und hoher Auflösung getestet, es funktioniert nicht.

Hinweis: In meinem xml Imageview Höhe und mit (55 * 55).

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

Bitte helfen Sie mir freundlicherweise, wie dieses Problem zu lösen. Ich kann dieses Problem nicht lösen.

Danke,

+0

In dieser Bibliothek wird die Eigenschaft für die gerundete Bitmap-Anzeige bereitgestellt. Hast du kontrolliert? – Piyush

Antwort

17

Wenn Sie ein Kreisbild wollen Sie .displayer(new RoundedBitmapDisplayer(25)) zu .displayer(new RoundedBitmapDisplayer(1000)), die für mich gearbeitet ändern können.

+0

auch für mich arbeiten.Vielen Dank. –

+0

Einstellen der Bildansicht Breite (Breite = Höhe) hat für mich gearbeitet. – Raviprakash

+0

Dank Arbeit für mich zu – Nicky

10

Wenn Sie ein abgerundetes Bild wollen, müssen Sie den abgerundete Bitmap displayer den Radius des Bildes setzen, die in Ihrem Fall ist 1/2 55 oder 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(); 

Aber es ist wahrscheinlich keine gute Idee, hard code das, ich würde die config ändern wenn man die bitmap tatsächlich bekommt und die breite berechnet.

+0

ich bekomme 120 * 120 Pixel von API. Alle Bilder haben die gleiche Größe –

+0

dann setzen Sie die gerundete Bitmap-Anzeige auf 60. Wenn Sie ein kreisförmiges Bild in etwas wollen, wird die Rahmengröße nur der Radius sein. – Brian

6

Ich habe festgestellt, dass der RoundedBitmpDisplayer selbst mit dem neusten Neuschreiben ziemlich langsam ist. Bei weitem der schnellste Weg, den ich gefunden habe, um abgerundete Ecken konsistent zu bekommen, ist RoundedImageView. https://github.com/vinc3m1/RoundedImageView Sie können diese Ansicht in UIL übergeben und die Ansicht wird sich darum kümmern, die Ecken für Sie zu runden. Sie geben einfach den gewünschten Radius an.

4

Als kingargyle unter Verwendung der RoundedImageView der beste Ansatz ist, und können Sie erreichen, was Sie wollen, nur um dies zu tun:

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

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

Also, wenn Sie nicht brauchen, um eine Menge von Cache-Optionen costumize, mit Picasso anstelle von Universal Image Loader mit RoundedImageView ist es die beste Option.

+0

Soll in 'diesem iRadiusDp' ein Leerzeichen stehen? Es sagt, dass es die Methode nicht lösen kann. –

+1

@PatMyron die Methode ist CornerRadiusDp. Ich erinnere mich nicht, warum ich "iRadiusDp" geschrieben habe. – GuilhE

1

Die Lösung von Tim ist gut, aber in meinem Fall, wenn das Bild größer als dann größer ist, ist das Bild mehr oval als Kreis. diesen Code Versuchen Sie, es funktioniert mit jeder Bildgröße:

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

als normale displayer Verwendung:

DisplayImageOptions options = new DisplayImageOptions.Builder() 
        .displayer(new CircleBitmapDisplayer()) 
        .cacheInMemory(true) 
        .cacheOnDisk(true) 
        .build(); 
ImageLoader.getInstance().displayImage(url, imageView,options); 
+0

funktioniert wie ein Charme) danke –

0

Verwenden .displayer(new CircleBitmapDisplayer()) in DisplayImageOptions

zusammen mit

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

in deiner Modulebene build.gradle.