Как заставить Picasso кэшировать и использовать изображение с измененным размером в следующий раз, когда запрашивался тот же URL-адрес изображения

android caching picasso

516 просмотра

2 ответа

28750 Репутация автора

Я использовал Пикассо, чтобы показать изображение в моем приложении. В некоторых случаях полученное изображение действительно огромно, и в этих случаях я хочу изменить размер изображения и теперь использовать измененное изображение.

Я использую следующий метод Пикассо для получения растрового изображения:

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), который, как я знаю, кэширует изображения, но я не могу его использовать.

Автор: Emil Adz Источник Размещён: 19.07.2016 08:32

Ответы (2)


0 плюса

28750 Репутация автора

Один из способов, которым я думал об этом, заключается в следующем:

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

Имейте в виду, что это означает, что изображение будет загружено дважды. Один раз, чтобы вы могли получить его размер и второй раз для изменения размера и сохранения этого изображения в кэш-памяти с измененным размером.

Автор: Emil Adz Размещён: 19.07.2016 01:01

1 плюс

985 Репутация автора

Вы можете попробовать это:

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);
Автор: Yoni Размещён: 20.07.2016 03:39
Вопросы из категории :
32x32