使用Picasso和Bitmaps

时间:2014-12-14 19:56:51

标签: android image bitmap imageview picasso

我有问题,我想将Picasso用于我的ListView,因为它具有出色的位图缓存,但目前只需使用imageView.setImageBitmap(bitmap);

我有一个位图的列表,它们没有下载或存储为文件,我只是拥有Bitmap对象,因为它们最初来自用户的相机或手机存储,但此时应用程序已经在每个位置放置了图像效果位图的位置使它们与原件不同,例如:

ArrayList<Bitmap> bitmapList = new ArrayList<>();

每个列表项只是一个显示其中一个位图的ImageView。当我尝试使用Picasso时,我意识到我不能简单地将ImageView设置为位图,就像ImageView.setImageBitmap()允许我做的那样,但我需要图像URI。从我所看到的,从这些位图获取URI的唯一方法是首先将图像存储在设备上,然后从这些存储的图像中提取URI。这个问题是在应用程序中需要一段时间来保存所有这些图像,然后为每个列表项提取正确的图像本身就是一个问题。

有没有办法将Picasso用于ImageViews,只需要一个位图,而不是先将图像保存到设备上,与ImageView.setImageBitmap()的工作方式类似?

2 个答案:

答案 0 :(得分:1)

  

我有问题,我想将Picasso用于我的ListView,因为它   有很好的位图缓存,但目前只需使用   imageView.setImageBitmap(位图);

图像缓存只有在你想要从RAM以外的某些地方加载图像时才会有用,这会导致花费一些时间,例如,如果你想从互联网上下载或从文件中读取,因为访问这些资源并不是那么快作为RAM。

ArrayList<Bitmap> bitmapList = new ArrayList<>();

上面的代码表示所有位图都在RAM中,因此您不需要任何缓存机制。如果你没有任何URI,则意味着你正在使用RAM。所以最好的解决方案是不使用毕加索并使用ImageView.setImageBitmap()

答案 1 :(得分:0)

Picasso在您可以实现的名为Target的界面中。它有3种实现方法

https://square.github.io/picasso/javadoc/com/squareup/picasso/Target.html

void    onBitmapFailed(android.graphics.drawable.Drawable errorDrawable)
void    onBitmapLoaded(android.graphics.Bitmap bitmap, Picasso.LoadedFrom from)
void    onPrepareLoad(android.graphics.drawable.Drawable placeHolderDrawable)
当从网址加载位图时,将调用

onBitMapLoaded。

因此,例如,如果您在当前类中实现Target,则可以执行以下操作:

Picasso.with(context).load(some_url).into(this);

然后当加载位图时,将调用onBitMapLoaded方法的实现。我相信毕加索的所有缓存仍然有效,事实上你甚至可以打印出来自位图的位置,内存,磁盘,文件或网络

onBitMapLoaded(Bitmap bitmap, LoadedFrom loadedFrom) {
  // do something like maybe
  myImageView.setImageBitmap(bitmap);
}