実行時にいくつかのオーバーレイアイテムをMapsForgeに追加したかったのです。正常に追加できますが、マップを移動またはズームした後にのみ表示されます。実際のところ、移動やズームのたびに、MapsForgeはinvalidate()
関数を介してタイルとオーバーレイアイテムを再描画することができます。とにかく、ここで述べられているように、これはMapsForgeリリース0.2.0以降、すでに修正されている問題です。MapViewクラスは、新しいアイテムが追加されるたびに自動的に再描画できるはずです。
MapsForge0.3.1を使用しています。私が何か間違ったことをしている、またはこの問題が現在のリリースで再発した。これが私のコードです。公式のMapsForgeサンプルアクティビティのコードを再利用しました:
public class MyMapView extends MapView{
//I brought some variables outside the Sample's function in order to add new items dynamically to the lists
ListOverlay mListOverlay;
List<OverlayItem> mOverlayItems;
Polyline mPolyline;
Circle mLastPosition;
//Basically here I do the same actions shown in the MapsForge samples. These items appear at once, with the onCreate() functions of the Activity
public void addInitialOverlays(){
Circle circle = createCircle(CENTRAL_STATION);
Polygon polygon = createPolygon(Arrays.asList(VICTORY_COLUMN, CENTRAL_STATION, BRANDENBURG_GATE));
mPolyline = createPolyline(Arrays.asList(BRANDENBURG_GATE, VICTORY_COLUMN));
Marker marker1 = createMarker(R.drawable.marker_red, VICTORY_COLUMN);
Marker marker2 = createMarker(R.drawable.marker_green, BRANDENBURG_GATE);
mLastPosition = createCircle(VICTORY_COLUMN);
mOverlayItems.add(circle);
mOverlayItems.add(polygon);
mOverlayItems.add(mPolyline);
mOverlayItems.add(marker1);
mOverlayItems.add(marker2);
mOverlayItems.add(mLastPosition);
getOverlays().add(mListOverlay);
}
//Here is the relevant part. This is called periodically from the main Activity
public void addPointToRoute(double latitude, double longitude) {
GeoPoint newPoint = new GeoPoint(latitude, longitude);
//Tried both removing the list from the overlays and re-adding it, and leaving it where it is; same result
//getOverlays().remove(mListOverlay);
mOverlayItems.remove(mPolyline);
List<GeoPoint> oldPolyline = mPolyline.getPolygonalChain().getGeoPoints();
oldPolyline.add(newPoint);
mPolyline = createPolyline(oldPolyline);
mOverlayItems.add(mPolyline);
mLastPosition.setGeoPoint(newPoint);
//getOverlays().add(mListOverlay);
invalidateOnUiThread();//This MapView function calls either invalidate() or postInvalidate(), depending on the situation
}
}