簡體   English   中英

圖片網址GoogleMap API V2中的自定義標記圖標

[英]Custom marker icon from image URL GoogleMap API V2

我有一個問題。

我的目標是加載公司的自定義圖片並顯示它,而不是默認標記圖標。

但是我已經面對了這個問題。

僅當我再次關閉並打開活動時才會顯示圖標。

這是我在地圖上添加標記的代碼。

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

    }
}

在這種情況下,它將顯示默認圖標 在此處輸入圖片說明

我試圖用這樣的另一種方式

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方面有一點經驗,也許我錯過了一些東西。

希望有人能幫忙。

謝謝。

問題不是在GoogleMapSupportMapFragment而是在Picasso ,不完全在Picasso而是在我的流程中。

使用自定義Target類時應該牢記的是, Picasso在內部使用WeakReference來存儲Target對象,因此,如果您只是直接在Picasso調用中創建新的Target ,它將被垃圾收集器銷毀。

Picasso提供了Callback類,因此您可以改為創建匿名類,並且該類將保留引用。

但是我缺少的一件事就是缺少Callback類,該類提供像Target這樣的響應中的Bitmap (但是目標通常由自定義視圖使用)。

所以我找到了這樣的解決方案,很丑陋,但是確實如此。

我已經創建了用於存儲目標對象的特殊列表,而不是將其丟棄。

  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");
    }

這是丑陋的解決方案,但此回調在將來可能會有所幫助。

請,如果您有想法如何使解決方案更好-請分享。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM