Die benutzerdefinierte ImageView-Klasse funktioniert nicht mit der Bibliothek zum Herunterladen von Picasso-Bildern

7

Ich habe kürzlich 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 (Canvas) -Methode, indem auf den Canvas, der übergeben wird, gezeichnet wird:

%Vor%

Dieses Bit funktioniert also, wenn Sie das Bild über ein Zeichen- oder Bitmap-Bild setzen. Ich habe es auch erweitert, damit ich es mit Google Volley NetworkImageView verwenden kann, das auch funktioniert.

Mein Problem kommt, wenn ich versuche, meine CircularImageView-Klasse neben der Picasso-Bild-Download-Bibliothek zu verwenden, da ich sie als Alternative zu Volley ansehe. Was passiert, ist eine ClassCastException in meiner loadBitmap () -Funktion in der ersten Zeile beim Abrufen der BitmapDrawable.

%Vor%

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

Ich möchte die Arbeit beibehalten, um das Bild in der onDraw (Canvas) -Methode in meiner CircularImageView-Klasse zu runden, da es schön enthalten und automatisch ist, anstatt den Prozess beim Einrichten der ImageView mit Picasso jedes Mal zu tun. Ist das möglich?

Vielen Dank im Voraus.

    
Richard Lewin 23.10.2013, 00:35
quelle

2 Antworten

14

Verwenden Sie für kreisförmige Bilder, die Picasso verwenden, diese Klasse, die Transformation implementiert.

%Vor%     
droidx 20.11.2013, 17:01
quelle
5

Wenn Sie dies mit Picasso tun, sollten Sie entweder:

  1. Wenden Sie die Rundung als Transformation an, so dass die gerundete Bitmap im Speicher zwischengespeichert wird, oder
  2. Erzwinge die Leinwand mit einem Shader in einer benutzerdefinierten Unterklasse ImageView . Details zu dieser Technik wurden von dem "Cagin Romain Guy" umrissen / "> in seinem Blog

Wenn versucht wird, das zugrunde liegende Bitmap aus einem ImageView zu ziehen, handelt es sich um ein Anti-Pattern. 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 -Rückruf es bereitstellen wird.

    
Jake Wharton 23.10.2013 01:15
quelle