如何强制Picasso在下次请求相同的图像URL时缓存并使用调整大小的图像

时间:2016-07-19 08:32:43

标签: android caching picasso

我使用Picasso在我的应用程序中显示图像。在某些情况下,收到的图像非常大,在这种情况下,我想调整图像大小,从现在开始使用调整大小的图像。

我正在使用以下Picasso方法来接收位图图像:

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

现在我希望在Utils.getResizedBitmapIfNeeded(bitmap)调整图像大小的情况下,我想在下次请求时使用这个已调整大小的图像。

如何在不使用resize(int,int)选项的情况下完成此操作,我知道该选项正在缓存图像,但我无法使用它。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

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

答案 1 :(得分:0)

我想做的一种方法如下:

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) {}
}

getResizedImageSize的位置:

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

请记住,这意味着图像将被加载两次。一旦这样你就可以得到它的大小,第二次调整大小并将这个图像存储到调整后的缓存中。