2016-08-08 15 views
-3

Nachdem ich einige Tage an diesem Problem festhielt, wollte ich nur meine Lösung mit Ihnen teilen und Ihre Zeit sparen.Bild von URL herunterladen, als kreisförmiges Bild mit Standardverhalten anzeigen

Problem
1. Laden Sie ein Bild von einem beliebigen URL
2. Zeigen Sie es als Kreis Bild (wenn Download erfolgreich)
3. Oder ein Standardbild in der gleichen ImageViewzeigen (wenn Download fehlgeschlagen)

[EDIT] ich wegen der sehr nützliche Hinweise meine Antwort entfernt aus Richtung @Budius und die bessere Arbeitslösung w er bietet unter

+0

Ich bin sehr traurig, aber der Code auf Ihre Antwort ist ziemlich schlecht. Es verwendet unzuverlässigen http-Code, es speichert das Ergebnis nicht, es weist Bitmap im UI-Thread zu und verarbeitet es, es ist nicht sicher für OutOfMemoryException, es funktioniert nicht gut auf ListView oder RecyclerView und es kann leicht zu einem Speicherverlust führen mit dieser AsyncTask, die sich auf die ImageView bezieht. – Budius

+0

@Budius danke für die Hinweise. Wie kann es leicht zu einem Speicherleck kommen? Verwendet libs wie Picasso den besseren Weg? –

+0

Ich habe eine Antwort hinzugefügt, die zeigt, wie man mit Picasso vorgeht. (Gleiten ist auch eine gute Option). Es kann zu Speicherlecks führen, weil Sie einen Verweis auf ImageView haben (mit Kontext, in dem die Aktivität enthalten ist). Wenn der Downloadvorgang lange dauert und Sie das Gerät drehen, kann der Garbage Collector die Aktivität nicht erfassen. – Budius

Antwort

0
compile 'com.squareup.picasso:picasso:2.5.0'//for load image from URL 
compile 'de.hdodenhof:circleimageview:1.3.0'//for circle imageview 

//add view in xml file 
<de.hdodenhof.circleimageview.CircleImageView 
        android:id="@+id/ivProfileImage" 
        android:layout_width="100dp" 
        android:layout_height="100dp" 
        android:layout_centerHorizontal="true" 
        android:layout_margin="10dp" 
        android:contentDescription="@null" 
        app:border_color="#ffffff" 
        app:border_width="2dp" /> 
//Load image from Java file 
private CircleImageView mIvProfileImage; 
mIvProfileImage = (CircleImageView) findViewById(R.id.ivProfileImage);  
Picasso.with(getApplicationContext()).load("IMAGE URL")//download URL 
.placeholder(R.drawable.ic_user_class)//use defaul image 
.error(R.drawable.ic_user_class)//if failed       
.into(mIvProfileImage);//imageview 
+0

Wenn du schnell willst, dann nimm es einfach sonst ... mach was du willst ... – comeback4you

1

Der beste Weg, um die Aufgabe aus der Frage zu erreichen, ist die Verwendung von Picasso mit einer kreisförmigen Transformation.

wie dem folgenden Code:

Picasso 
    .with(context) 
    .load(url) 
    .placeholder(placeHolderDrawable) 
    .error(errorDrawable) 
    .transform(circleTransform) 
    .into(imageView); 

und der Code für die circleTransform von diesem Link kopiert: https://gist.github.com/julianshen/5829333

public class CircleTransform implements Transformation { 
    @Override 
    public Bitmap transform(Bitmap source) { 
     int size = Math.min(source.getWidth(), source.getHeight()); 

     int x = (source.getWidth() - size)/2; 
     int y = (source.getHeight() - size)/2; 

     Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); 
     if (squaredBitmap != source) { 
      source.recycle(); 
     } 

     Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig()); 

     Canvas canvas = new Canvas(bitmap); 
     Paint paint = new Paint(); 
     BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); 
     paint.setShader(shader); 
     paint.setAntiAlias(true); 

     float r = size/2f; 
     canvas.drawCircle(r, r, r, paint); 

     squaredBitmap.recycle(); 
     return bitmap; 
    } 

    @Override 
    public String key() { 
     return "circle"; 
    } 
}