/*
* Copyright (c) 2016 Daimler AG / Moovel GmbH
*
* All rights reserved
*/
package com.car2go.maps.osm.drawable;
import android.graphics.drawable.BitmapDrawable;
import com.car2go.maps.model.BitmapDescriptor;
import com.car2go.maps.model.LatLng;
import com.car2go.maps.model.Marker;
import com.car2go.maps.model.MarkerOptions;
import com.car2go.maps.osm.OsmBitmapDescriptor;
import com.car2go.maps.osm.drawable.overlay.MarkerOverlayItem;
import com.car2go.maps.osm.util.OsmUtils;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import static com.car2go.maps.osm.util.OsmUtils.anchorToHotspot;
/**
* Draws marker on OpenStreetMaps.
* Associated with given {@link com.car2go.maps.AnyMap} object, so it should not be cached.
*/
public class OsmMarker implements Marker {
private final MapView map;
private final LatLng position;
private final ItemizedIconOverlay<MarkerOverlayItem> overlay;
private final MarkerOverlayItem overlayItem;
private boolean removed = false;
private boolean visible = true;
OsmMarker(MapView map, MarkerOptions options, ItemizedIconOverlay<MarkerOverlayItem> markersOverlay) {
this.map = map;
overlayItem = new MarkerOverlayItem(
OsmUtils.toGeoPoint(options.getPosition()),
this
);
OsmBitmapDescriptor descriptor = (OsmBitmapDescriptor) options.getIcon();
overlayItem.setMarker(
new BitmapDrawable(map.getResources(), descriptor.bitmap)
);
overlayItem.setMarkerHotspot(
anchorToHotspot(options.getAnchorU(), options.getAnchorV())
);
markersOverlay.addItem(overlayItem);
overlay = markersOverlay;
position = options.getPosition();
map.invalidate();
}
@Override
public void setIcon(BitmapDescriptor icon) {
OsmBitmapDescriptor descriptor = (OsmBitmapDescriptor) icon;
overlayItem.setMarker(new BitmapDrawable(map.getResources(), descriptor.bitmap));
map.invalidate();
}
@Override
public LatLng getPosition() {
return position;
}
@Override
public void showInfoWindow() {
// Do nothing
}
@Override
public void setRotation(float rotation) {
// Do nothing
}
@Override
public void setVisible(boolean visible) {
if (removed || this.visible == visible) {
return;
}
if (visible) {
overlay.addItem(overlayItem);
} else {
overlay.removeItem(overlayItem);
}
this.visible = visible;
map.invalidate();
}
@Override
public void remove() {
if (!visible) {
removed = true;
}
if (removed) {
return;
}
overlay.removeItem(overlayItem);
removed = true;
visible = false;
map.invalidate();
}
@Override
public void setZ(int z) {
// Do nothing
}
}