2016-07-19 12 views
3

Ich benutze Picasso, um Bild in meiner Anwendung zu zeigen. In einigen Fällen ist das Bild sehr groß und in diesen Fällen werde ich das Bild verkleinern und ab sofort das Bild in der Größe verwenden.Wie Picasso gezwungen wird, ein Bild in der Größe zu speichern und zu speichern, wenn die gleiche Bild-URL das nächste Mal angefordert wird:

ich die folgende Methode von Picasso bin mit dem Bitmap-Bild zu erhalten:

articleVH.mTarget = new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
    if(bitmap != null) { 
      articleVH.mCoverImage.setImageBitmap(Utils.getResizedBitmapIfNeeded(bitmap)); 
     } else { 
      mTimelineViewCallback.getArticleImage(articleCoverData); 
     } 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     mTimelineViewCallback.getArticleImage(articleCoverData); 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) {} 
}; 

Jetzt, wo ich will, falls Utils.getResizedBitmapIfNeeded(bitmap) das Bild paßt die Größe, ich will das skalierte Bild es das nächste Mal verwendet werden wird angefordert werden.

Wie kann dies getan werden, ohne die resize (int, int) -Option zu verwenden, von der ich weiß, dass sie die Bilder zwischenspeichert, aber ich kann sie nicht verwenden.

Vielen Dank im Voraus.

+0

Warum können Sie nicht die Größe() verwenden? –

Antwort

0

Ein Weg, ich dachte, es zu tun ist wie folgt:

articleVH.mTarget = new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     if(bitmap != null) { 
      int[] resizedImageSize = Utils.getResizedImageSize(bitmap); 
      if (bitmap.getHeight() == resizedImageSize[0] && bitmap.getWidth() == resizedImageSize[1]) { 
       mPicasso.load(articleCoverData.mImageUrl).into(articleVH.mCoverImage); 
      } else { 
       mPicasso.load(articleCoverData.mImageUrl).resize(resizedImageSize[1], resizedImageSize[0]).into(articleVH.mCoverImage); 
      } 
     } else { 
      mTimelineViewCallback.getArticleImage(articleCoverData); 
     } 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) { 
     mTimelineViewCallback.getArticleImage(articleCoverData); 
    } 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) {} 
} 

Wo getResizedImageSize ist:

public static int[] getResizedImageSize(@NonNull Bitmap originalBitmap) { 
    int bitmapHeight = originalBitmap.getHeight(); 
    int bitmapWidth = originalBitmap.getWidth(); 

    int[] originalSize = {bitmapHeight, bitmapWidth}; 

    if (!(bitmapHeight > Constants.IMAGE_EDGE_SIZE_LIMIT && bitmapWidth > Constants.IMAGE_EDGE_SIZE_LIMIT)){ 
     return originalSize; 
    } 

    if (BuildConfig.DEBUG) { 
     Log.e(TAG, "Original Bitmap: Height: " + bitmapHeight + " Width: " + bitmapWidth); 
    } 

    float ratio = bitmapHeight/Constants.IMAGE_EDGE_SIZE_LIMIT; 
    bitmapHeight = Constants.IMAGE_EDGE_SIZE_LIMIT; 
    bitmapWidth = (int) (bitmapWidth * (1/ratio)); 

    int[] newSize = {bitmapHeight, bitmapWidth}; 
    return newSize; 
} 

Nehmen Sie daran, dass es bedeutet, dass das Bild zweimal werden wird geladen. Einmal konnte man die Größe und zweitens die Größe ändern und dieses Bild in der Größe des Caches speichern.

1

können Sie dies versuchen:

Picasso 
.with(context) 
.load(your_image) 
.resize(4000, 2000) 
.onlyScaleDown() // the image will only be resized if it's bigger than 4000x2000 pixels. 
.into(your_image_view);