マップ ビューでマーカーを移動したい。最初に、私はこれが好きです:
public void moveMarker(Marker marker, int lng, int lat) {
if (marker == null) {
return;
}
String key = marker.getKey();
OverlayItem item = (OverlayItem) markers.get(key);
GeoPoint point = new GeoPoint(lat, lng);
GeoPoint oldPoint = item.getPoint();
if (oldPoint.getLatitudeE6() == point.getLatitudeE6()
&& oldPoint.getLongitudeE6() == point.getLongitudeE6()) {
return;
}
overlay.removeOverlay(item);
OverlayItem newItem = new OverlayItem(point, marker.getTitle(), marker
.getSnippet());
newItem.setMarker(marker.getIcon());
overlay.addOverlay(newItem);
mapView.postInvalidate();
markers.put(key, newItem);
}
はい、これは機能します。ただし、マーカーが移動すると、他のマーカーが更新されます。したがって、次のようなコードを変更します。
public void moveMarker(Marker marker, int lng, int lat) {
if (marker == null) {
return;
}
String key = marker.getKey();
MarkerOverlay overlay = markers.get(key);
OverlayItem item = overlay.getItem(0);
GeoPoint point = new GeoPoint(lat, lng);
GeoPoint oldPoint = item.getPoint();
if (oldPoint.getLatitudeE6() == point.getLatitudeE6()
&& oldPoint.getLongitudeE6() == point.getLongitudeE6()) {
return;
}
mapOverlays.remove(overlay);
MarkerOverlay overlayN = null;
if (marker instanceof CarMarker) {
CarMarker cm = (CarMarker) marker;
overlayN = new CarMarkerOverlay(null, mapView, cm.getCarId());
} else if (marker instanceof Marker) {
overlayN = new MarkerOverlay(null);
}
OverlayItem newItem = new OverlayItem(point, marker.getTitle(),
marker.getSnippet());
newItem.setMarker(marker.getIcon());
overlayN.addOverlay(newItem);
mapOverlays.add(overlayN);
markers.put(key, overlayN);
mapView.postInvalidate();
}
これは私が望んでいたように機能します。しかし、質問があります。マーカーが移動するたびに、MarkerOverlay を削除して再作成しますが、非効率ですか? 前もって感謝します!マーカーと mapOverlays 定義という名前の変数:
private Map<String, MarkerOverlay> markers = new ConcurrentHashMap<String, MarkerOverlay>();
private List<Overlay> mapOverlays = null;
mapOverlays = mapView.getOverlays();
いくつかのクラス定義:
public class MarkerOverlay extends ItemizedOverlay<OverlayItem>{}
public class CarMarkerOverlay extends MarkerOverlay {}