2013-10-23 12 views
7

Ho recentemente esteso da ImageView per creare una classe CircularImageView che rende l'immagine circolare con un bordo colorato. Questo viene fatto tramite il metodo OnDraw (tela) disegnando sulla tela che viene passato in:Classe personalizzata ImageView non funzionante con la libreria di download di immagini Picasso

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

Quindi questo bit funziona quando si imposta l'immagine tramite un disegnabile o bitmap. L'ho anche esteso in modo da poterlo utilizzare con Volley NetworkImageView di Google, che funziona anche.

Il mio problema si presenta quando provo con noi la mia classe CircularImageView accanto alla libreria di download di immagini di Picasso mentre la sto guardando come alternativa a Volley. Ciò che accade è una classe ClassCastException nella mia funzione loadBitmap() sulla prima riga quando si ottiene BitmapDrawable.

private void loadBitmap() 
{ 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable(); 

    if(bitmapDrawable != null) 
     image = bitmapDrawable.getBitmap(); 
} 

Inizialmente prima che Picasso abbia scaricato l'immagine arrotonda perfettamente l'immagine del segnaposto. Ma non appena l'immagine è stata scaricata da Picasso, fallisce con una ClassCastException in quanto getDrawable() restituisce PicassoDrawable piuttosto che BitmapDrawable.

Mi piacerebbe mantenere il lavoro per arrotondare l'immagine nel metodo onDraw (canvas) nella mia classe CircularImageView in quanto è ben contenuta e automatica rispetto a fare il processo quando si imposta ImageView con Picasso ogni volta . È possibile?

Grazie in anticipo.

risposta

14

Per le immagini circolari con Picasso, utilizzare la classe this che implementa Trasformazione.

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

Questo crea una nuova bitmap ogni volta, no? – secureboot

+0

Grazie a DesertIvy, droidx e Jake Wharton per l'aiuto. Il progetto per cui questo è stato messo in attesa è appena tornato al problema ora. Ho appena provato quanto sopra con opere semplicemente perfette. –

5

Nel fare questo con Picasso si debbono:

  1. Applicare l'arrotondamento come Transformation in modo che il bitmap arrotondata viene memorizzato nella cache in memoria, o
  2. pinza la tela con uno shader in un costume ImageView sottoclasse . Dettagli su questa tecnica sono stati illustrati dalla Cagin' il ragin Romain Guy on his blog

Cercando di tirare il sottostante Bitmap su un ImageView è un anti-modello. Se hai bisogno di accedere a un Bitmap (e non lo fai, dovresti usare uno dei precedenti), attua Target sulla tua vista il cui callback onBitmapSuccess lo fornirà.

Problemi correlati