来自图片网址GoogleMap API V2的自定义标记图标

时间:2016-02-21 14:46:06

标签: android google-maps android-activity google-maps-markers picasso

我有一个问题。

我的目标是加载公司的自定义图片,并将其显示为默认标记图标。

但我遇到了这个问题。

仅当我再次关闭并打开活动时才会显示图标。

以下是我在地图中添加标记的代码。

private void addMarkerToTheMap(GoogleMapInfoBundle infoBundle) {
        if (infoBundle.placeMarker) {
            LatLng latLng = new LatLng(infoBundle.company.getLatitude(), infoBundle.firm.getLongitude());
            MarkerOptions markerOptions = new MarkerOptions()
                    .title(infoBundle.company.getName())
                    .snippet(infoBundle.company.getAddress())
                    .position(latLng);
            Marker marker = mGoogleMap.addMarker(markerOptions);
            try {
                Picasso.with(this).load(NetworkUtils.getUrlOfScaledImage(infoBundle.company.getLogo(), DEFAULT_ICON_SCALE_PERCENTAGE)).into(new PicassoMarker(marker));
            } catch (IllegalArgumentException ignore) {
                // Do nothing
            }
        }

PicassoMarker

public class PicassoMarker implements Target {
    Marker mMarker;

    public 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) {

    }
}

在这种情况下,它会显示默认图标enter image description here

我试图用另一种方式制作它

MarkerOptions markerOptions = new MarkerOptions()
                        .title(infoBundle.company.getName())
                        .snippet(infoBundle.company.getAddress())
                        .position(latLng);
  try {
                Picasso.with(this).load(NetworkUtils.getUrlOfScaledImage(infoBundle.company.getLogo(), DEFAULT_ICON_SCALE_PERCENTAGE)).into(new PicassoMarker(mGoogleMap, markerOptions));
            } catch (IllegalArgumentException ignore) {
                // Do nothing
            }

在下载图像后,在回调中将标记添加到地图中。

   @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        mMarkerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
        mGoogleMap.addMarker(mMarkerOptions);
    }

在这种情况下,它没有显示任何标记。

但是在这两种情况下,如果我关闭Activity并再次打开它,所有内容都将正确显示图标。

我不知道是什么原因造成了这样的问题。似乎GoogleMap缓存了图标图像或其他内容。

我在使用GoogleMaps API方面有一点经验,也许我错过了一些东西。

希望有人可以提供帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

问题不在于GoogleMapSupportMapFragment,而在Picasso,而不是Picasso,而是在我的流程中。

您应该始终记住使用自定义Target类的事情是内部Picasso使用WeakReference来存储Target类,因此如果您只是创建新的Target直接在Picasso内调用它将被垃圾收集器销毁。

Picasso提供Callback类,因此您可以创建匿名类,并且您的类将保留引用。

但有一件事我错过Callback类,在Bitmap等响应中提供Target(但目标主要由自定义视图使用)。

所以我找到了这样的解决方案,它很难看,但现在就是。

我已经创建了用于存储目标对象的特殊列表,而不是用于存储。

  Marker marker = mGoogleMap.addMarker(markerOptions);
            mMarkerCompanyMap.put(marker, infoBundle.firm);
            try {
                PicassoMarkerTarget markerTarget = new PicassoMarkerTarget(marker, mImageLoadingCallback);
                mPicassoMarkerTargetList.add(markerTarget);
                Picasso.with(this)
                        .load(NetworkUtils.getUrlOfScaledImage(infoBundle.firm.getLogo(), DEFAULT_ICON_SCALE_PERCENTAGE))
                        .into(markerTarget);
            } catch (IllegalArgumentException ignore) {
                // Do nothing
            }

我正在通过mImageLoadingCallback来回复来自Target的活动 它看起来像。

private Callback mImageLoadingCallback = new Callback() {
        @Override
        public void onSuccess() {
            Logger.logError("IMAGE LOADED IN CALLBACK " + mPendingImagesCount);
            if (mPendingImagesCount <= 0) {
                mPicassoMarkerTargetList.clear();
            } else {
                mPendingImagesCount--;
            }
        }

        @Override
        public void onError() {
            // You may start laughing, but just for the sake of not duplicating code
            onSuccess();
        }
    };

此回调可用于其他目的,但现在仅用于清除数组。

当然还有PicassoMarkerTarget

   @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
        mDownloadListenerCallback.onSuccess();
        Logger.logError("IMAGE LOADED IN PICASSO MARKER TARGET");
    }

这是一个丑陋的解决方案,但也许这个回调在将来会有所帮助。

如果您知道如何更好地解决问题,请分享。 感谢。