2015-04-06 12 views
9

Sto cercando di sostituire Picasso nella mia app Android con Fresco. Tuttavia non sono sicuro di come caricare semplicemente una bitmap usando Fresco.Utilizzo di Affresco di Facebook per caricare una bitmap

Con Picasso vorrei fare solo quanto segue.

Bitmap poster = Picasso.with(getActivity()) 
        .load(url) 
        .resize(Utils.convertDpToPixel(WIDTH,HEIGHT)) 
        .centerCrop() 
        .get(); 

Non sono riuscito a capire come creare una bitmap con questo affresco. Qualche idea?

+0

per quanto ne so non c'è modo direttamente a scambiare questo le librerie dal Affresco non si basa sulla classe Bitmap standard, ma piuttosto nella loro attuazione. –

risposta

2

usereste pipeline di immagine di Fresco direttamente per questo:

http://frescolib.org/docs/using-image-pipeline.html

Anche se non sono indiscreto - qual è la motivazione qui? Perché hai bisogno della Bitmap stessa?

+1

Si potrebbe voler salvare l'immagine su SD e scrivere il suo percorso in un database 'SQLight' locale, per esempio. Potresti anche volere l'immagine di risoluzione originale per scopi successivi, mentre chiamare '.resize()' nell'esempio precedente ti darà un'immagine ridimensionata (non sicuro se Fresco farebbe lo stesso, ma questo è il motivo per cui stavo ridimensionando le immagini me stesso quando uso 'Picasso'). – Droidman

+2

Sono sicuro che darò una prova a Fresco nei miei nuovi progetti, ma solo per indicarlo - IMHO, l'accesso all'immagine scaricata come oggetto 'Bitmap' (o qualche altro formato che puoi manipolare direttamente) è una caratteristica importante molti sviluppatori potrebbero voler vedere – Droidman

+0

Avrò bisogno del riferimento per creare un indicatore di mappa per l'API di Google Maps (per un esempio) – Kenny

17

Come Affresco detto:

Se la tua richiesta alla pipeline è per un'immagine decodificata - una bitmap Android, è possibile usufruire della nostra BaseBitmapDataSubscriber più facile da usare:

dataSource.subscribe(new BaseBitmapDataSubscriber() { 
    @Override 
    public void onNewResultImpl(@Nullable Bitmap bitmap) { 
     // You can use the bitmap in only limited ways 
     // No need to do any cleanup. 
    } 

    @Override 
    public void onFailureImpl(DataSource dataSource) { 
     // No cleanup required here. 
    } 
    }, 
    executor); 

Puoi non assegnare la bitmap a nessuna variabile non inclusa nell'ambito del metodo onNewResultImpl.

http://frescolib.org/docs/datasources-datasubscribers.html#_

Il mio codice:

public void setDataSubscriber(Context context, Uri uri, int width, int height){ 
    DataSubscriber dataSubscriber = new BaseDataSubscriber<CloseableReference<CloseableBitmap>>() { 
     @Override 
     public void onNewResultImpl(
       DataSource<CloseableReference<CloseableBitmap>> dataSource) { 
      if (!dataSource.isFinished()) { 
       return; 
      } 
      CloseableReference<CloseableBitmap> imageReference = dataSource.getResult(); 
      if (imageReference != null) { 
       final CloseableReference<CloseableBitmap> closeableReference = imageReference.clone(); 
       try { 
        CloseableBitmap closeableBitmap = closeableReference.get(); 
        Bitmap bitmap = closeableBitmap.getUnderlyingBitmap(); 
        if(bitmap != null && !bitmap.isRecycled()) { 
         //you can use bitmap here 
        } 
       } finally { 
        imageReference.close(); 
        closeableReference.close(); 
       } 
      } 
     } 
     @Override 
     public void onFailureImpl(DataSource dataSource) { 
      Throwable throwable = dataSource.getFailureCause(); 
      // handle failure 
     } 
    }; 
    getBitmap(context, uri, width, height, dataSubscriber); 
} 

/** 
* 
* @param context 
* @param uri 
* @param width   
* @param height   
* @param dataSubscriber 
*/ 
public void getBitmap(Context context, Uri uri, int width, int height, DataSubscriber dataSubscriber){ 
    ImagePipeline imagePipeline = Fresco.getImagePipeline(); 
    ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(uri); 
    if(width > 0 && height > 0){ 
     builder.setResizeOptions(new ResizeOptions(width, height)); 
    } 
    ImageRequest request = builder.build(); 
    DataSource<CloseableReference<CloseableImage>> 
      dataSource = imagePipeline.fetchDecodedImage(request, context); 
    dataSource.subscribe(dataSubscriber, UiThreadExecutorService.getInstance()); 
} 
+0

Come sappiamo, l'opzione di ridimensionamento funziona solo per jpeg, quando si tratta di png o gif e tali roba, affresco non può occuparsene perfettamente. Quindi voglio solo ridimensionare la bitmap e caricarla da Fresco.Ma non so come usare affresco per caricare una bitmap non un uri. Il motivo per cui voglio usare Fresco per caricarlo è usare la sua cache. –

Problemi correlati