我想使用Picasso来检索Bitmap图像以用作标记图标,但我不知道该怎么做。如果我使用Picasso将图像插入图像视图,我知道我可以使用:
Picasso.with(MainActivity.this).load(URL).into(photo_imageview);
当然,如果我将其传递给.icon()
有没有一种简单的方法可以达到这个目的?
感谢有人看看这个!
答案 0 :(得分:27)
Picasso提供了一个通用的Target
界面,您可以使用它来实现自己的图像目标。具体来说,您需要覆盖onBitmapLoaded
以填充标记。
下面给出了一个基本实现。
public class PicassoMarker implements Target {
Marker mMarker;
PicassoMarker(Marker marker) {
mMarker = marker;
}
@Override
public int hashCode() {
return mMarker.hashCode();
}
@Override
public boolean equals(Object o) {
if(o instanceof PicassoMarker) {
Marker marker = ((PicassoMarker) o).mMarker;
return mMarker.equals(marker);
} else {
return false;
}
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}
你会像这样使用它 -
marker = new PicassoMarker(myMarker);
Picasso.with(MainActivity.this).load(URL).into(marker);
注意毕加索只持有对传递给Target
的{{1}}的一周参考。因此,into
引用需要存在,直到加载图像,以避免垃圾回收器清理回调。
答案 1 :(得分:0)
查看此google地图示例代码,您可以找到InfoWindowAdapter
实现来实现它:
googlemaps/android-samples
答案 2 :(得分:0)
作为从位图生成图标的@iagreen答案,您可以使用 Iconfactory 。
科特林版本:
class PicassoMarker(
val marker: Marker,
private val iconFactory: IconFactory) : Target {
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
Timber.d("picassoMarker onPrepareLoad : ")
}
override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {
Timber.e("picassoMarker onBitmapFailed: ")
}
override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
try {
if (bitmap != null) {
marker.icon = iconFactory.fromBitmap(bitmap)
}
} catch (ex: IllegalArgumentException) {
Timber.e(ex, "Marker is dead")
}
}
override fun equals(other: Any?): Boolean {
if (other is PicassoMarker) {
return marker == other
}
return false
}
override fun hashCode(): Int {
return marker.hashCode()
}}
并像这样使用:
fun addMarker(marker: Marker): com.mapbox.mapboxsdk.annotations.Marker {
val markerOption = MarkerOptions().position(marker.latLng)
markerOption.icon =
iconFactory
.fromBitmap(
Bitmap.createBitmap(
1,
1,
Bitmap.Config.ARGB_8888
)
)
val iconFactory = IconFactory.getInstance(context)
val picassoMarker = PicassoMarker(
mapProvider.map.addMarker(markerOption),
iconFactory
)
try {
val picasso = Picasso.get().apply {
this.isLoggingEnabled = true
}
picasso.load(marker.iconUrl)
.noPlaceholder()
.into(picassoMarker)
} catch (ex: Exception) {
Timber.e(ex, "Picasso crashed")
}
return picassoMarker.marker
}