如何使用Picasso为Marker添加图标?

时间:2014-11-23 23:01:48

标签: android google-maps picasso

我想使用Picasso来检索Bitmap图像以用作标记图标,但我不知道该怎么做。如果我使用Picasso将图像插入图像视图,我知道我可以使用:

 Picasso.with(MainActivity.this).load(URL).into(photo_imageview);

当然,如果我将其传递给.icon()

,这将无效

有没有一种简单的方法可以达到这个目的?

感谢有人看看这个!

3 个答案:

答案 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
}