2013-10-23 6 views
7

Ich habe vor kurzem von einem ImageView erweitert, um eine CircularImageView-Klasse zu erstellen, die das Bild mit einem farbigen Rand kreisförmig macht. Dies geschieht über die OnDraw (Leinwand) Methode durchgeführt, indem auf die Leinwand Zeichnung, die in übergeben wird:Benutzerdefinierte ImageView-Klasse funktioniert nicht mit Picasso-Image-Download-Bibliothek

//load the bitmap 
    loadBitmap(); 

    // init shader 
    if(image !=null) 
    { 
     shader = new BitmapShader(Bitmap.createScaledBitmap(image, viewWidth + (borderWidth * 2), viewHeight + (borderWidth * 2), true), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 
     paint.setShader(shader); 

     int circleCenter = viewWidth/2; 

     // circleCenter is the x or y of the view's center 
     // radius is the radius in pixels of the cirle to be drawn 
     // paint contains the shader that will texture the shape 
     canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth, paintBorder); 
     canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paintBackground); 
     canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paint); 
    } 

So dieses Bit funktioniert, wenn das Bild über ein ziehbar oder Bitmap-Einstellung. Ich habe es auch erweitert, damit ich es mit Google's Volley NetworkImageView verwenden kann, das auch funktioniert.

Mein Problem kommt, wenn ich versuche und mir meine CircularImageView-Klasse neben Picasso Image-Download-Bibliothek, wie ich es sehe als Alternative zu Volley. Was passiert, ist eine ClassCastException in meiner loadBitmap() -Funktion in der ersten Zeile beim Abrufen der BitmapDrawable.

Bevor Picasso das Bild heruntergeladen hat, rundet es das Platzhalterbild gut ab. Sobald das Bild jedoch von Picasso heruntergeladen wurde, schlägt es mit einer ClassCastException fehl, da getDrawable() und PicassoDrawable anstelle von BitmapDrawable zurückgegeben werden.

Ich würde gerne die Arbeit zu runden das Bild in der OnDraw (Canvas) -Methode in meiner CircularImageView-Klasse, wie es schön enthalten ist und automatisch im Gegensatz zu den Prozess beim Einrichten der ImageView mit Picasso jedes Mal . Ist das möglich?

Vielen Dank im Voraus.

Antwort

14

Verwenden Sie für zirkuläre Bilder, die Picasso verwenden, die Klasse this, die Transformation implementiert.

Picasso.with(context).load(url).transform(new RoundedTransformation(radius, margin)).into(imageview); 
+0

Dies erstellt jedes Mal ein neues Bitmap, nicht? – secureboot

+0

Danke DesertIvy, droidx und Jake Wharton für die Hilfe. Das Projekt, für das es bestimmt war, wurde auf Eis gelegt und kam jetzt einfach auf das Problem zurück. Ich habe gerade das oben genannte mit Arbeiten einfach perfekt versucht. –

5

Wenn dies mit Picasso zu tun sollten Sie entweder:

  1. übernehmen Sie die Rundung als Transformation so dass die abgerundete Bitmap im Arbeitsspeicher zwischengespeichert wird, oder
  2. Klemmen Sie die Leinwand mit einem Shader in einer benutzerdefinierten ImageView Unterklasse . Details zu dieser Technik wurden von den ragin Cagin' skizziert Romain Guy on his blog

Den Versuch, die zugrunde liegenden Bitmap aus einem ImageView ist ein Anti-Muster zu ziehen. Wenn Sie Zugriff auf eine Bitmap benötigen (und Sie nicht, sollten Sie eine der oben genannten verwenden), implementieren Sie Target auf Ihrer Ansicht, deren onBitmapSuccess Callback es bereitstellen wird.