Android 如何在下次请求相同的图像URL时强制毕加索缓存并使用已调整大小的图像
我使用毕加索在我的应用程序中显示图像。在某些情况下,收到的图像非常巨大,在这些情况下,我想调整图像的大小,从现在起使用调整大小的图像 我使用毕加索的以下方法接收位图图像:Android 如何在下次请求相同的图像URL时强制毕加索缓存并使用已调整大小的图像,android,caching,picasso,Android,Caching,Picasso,我使用毕加索在我的应用程序中显示图像。在某些情况下,收到的图像非常巨大,在这些情况下,我想调整图像的大小,从现在起使用调整大小的图像 我使用毕加索的以下方法接收位图图像: articleVH.mTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { if(bitmap != null) { arti
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(位图)
调整图像大小的情况下,下次请求时使用此调整大小的图像
如何在不使用resize(int,int)选项的情况下实现这一点,我知道该选项正在缓存图像,但我无法使用它。我考虑的一种方法如下:
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;
}
请记住,这意味着图像将被加载两次。一次,以便获得图像的大小;第二次,用于调整大小并将此图像存储到已调整大小的缓存中。您可以尝试以下方法:
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);
为什么不能使用resize()?