2015-07-16 2 views

risposta

22

È possibile utilizzare target di Picasso:

  Picasso.with(this).load("http://imageUrl").into(new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       mYourLayout.setBackground(new BitmapDrawable(bitmap)); 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }); 

UPDATE

Come @BladeCoder menzionato nel commento, Picasso contiene un riferimento debole per target gli oggetti, quindi è probabile essere spazzatura raccolta

Così, seguendo Jake Wharton's comment su uno dei problemi, credo che questo potrebbe essere un buon modo per andare:

CustomLayout mCustomLayout = (CustomLayout)findViewById(R.id.custom_layout) 
    Picasso.with(this).load("http://imageUrl").into(mCustomLayout); 

CustomLayout.java:

public class CustomLayout extends LinearLayout implements Target { 

    public CustomLayout(Context context) { 
     super(context); 
    } 

    public CustomLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 


    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     setBackground(new BitmapDrawable(getResources(), bitmap)); 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     //Set your error drawable 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) { 
     //Set your placeholder 
    } 
} 
+1

Il codice di questo esempio potrebbe non sempre funziona: si * deve * mantenere un riferimento concreto al vostro 'Target' o può essere garbage collection prima che l'immagine viene caricata perché Picasso mantiene debole riferimenti a obiettivi. – BladeCoder

+0

@BladeCoder Hai ragione. Sto modificando la mia risposta per risolvere il problema. Grazie – mmark

+0

Sto avendo un po 'di problemi usando Picasso's Target come hai mostrato sopra ... (qualsiasi assistenza è apprezzata) http://pastebin.com/uY2LnSDV – AndroidAndroidAndroid

4

Io uso un ImageView come ImageHolder temporanea . Inizialmente, carica l'immagine con Picasso in ImageView e imposta lo sfondo del layout da questo ImageView usando getDrawable.

   ImageView img = new ImageView(this); 
       Picasso.with(this) 
       .load(imageUri) 
       .fit() 
       .centerCrop() 
       .into(img, new Callback() { 
         @Override 
         public void onSuccess() { 

          myLayout.setBackgroundDrawable(img.getDrawable()); 
         } 

         @Override 
         public void onError() { 

         } 
        }); 
+0

Non è la soluzione migliore, ma una soluzione comunque. – stevyhacker

1

Nel mio caso avevo bisogno l'immagine per adattarla al formato della imageview così invece di caricare l'immagine di sfondo Ho aggiunto questa struttura al ImageView e caricate l'immagine normalmente.

android:scaleType="fitXY" 
0

Nessuna delle soluzioni sopra ha funzionato per me. Ma la soluzione di @ Thiha era la più vicina. Il seguito ha lavorato per me:

final ImageView img = new ImageView(this); 
Picasso.with(img.getContext()) 
.load(url) 
.into(img, new com.squareup.picasso.Callback() { 
@Override 
public void onSuccess() { 
collapsingToolbarLayout.setBackgroundDrawable(img.getDrawable()); 
} 

@Override 
public void onError() { 
} 
});