[英]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
方面有一點經驗,也許我錯過了一些東西。
希望有人能幫忙。
謝謝。
問題不是在GoogleMap
或SupportMapFragment
而是在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.