我必须建立一个地图活动,最重要的是,我需要显示一些位置点。这些位置从另一个类的哈希表中检索。此哈希表的内容始终会更改。所以我希望看到Map Activity上的那些位置点随着哈希表的修改而移动。 代码如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapview);
MapView mapView = (MapView) this.findViewById(R.id.map);
mapView.setStreetView(true);
mc = mapView.getController();
mc.animateTo(...);
mc.setZoom(12);
mapView.invalidate();
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
MarkerOverlay mark = new MarkerOverlay(p);
listOfOverlays.add(mark);
for(Entry<Long,Pair> p: LQTManager.getInstance().ResultTable.entrySet())
{
GeoPoint point = new GeoPoint(
(int) (p.getValue().x * 1E6),
(int) (p.getValue().y * 1E6));//some code is not shown
MarkerOverlay markerOverlay = new MarkerOverlay(point);
listOfOverlays.add(markerOverlay);
}
mapView.postInvalidate();
}
class MarkerOverlay extends com.google.android.maps.Overlay
{
public GeoPoint pt;
public MarkerOverlay(GeoPoint pt){
this.pt=pt;
}
@Override
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
Point screenPts = new Point();
mapView.getProjection().toPixels(pt, screenPts);
Bitmap bmp = BitmapFactory.decodeResource(
getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x-16, screenPts.y-32, null);
return true;
}
}
如果我触摸屏幕,有没有办法刷新叠加对象。我正在考虑将一些函数放在MarkerOverlay的onTap覆盖方法中。但我认为如果我试图让Overlay尝试清除自己是不合逻辑的? 任何建议的想法?
答案 0 :(得分:7)
mapView.postInvalidate()将更新地图视图并重新绘制叠加层。我和Runnable一起使用它来每秒刷新我的叠加层:
private Handler handler = new Handler();
private Runnable refreshTask = new Runnable()
{
public void run()
{
handler.removeCallbacks(this);
mapView.postInvalidate();
handler.postDelayed(this, 1000);
}
};
答案 1 :(得分:1)
这可能并不完美,但它对我有用,你可以稍微前后移动地图,然后更新所有叠加层。
mapView.getController().scrollBy(1, 1);
mapView.getController().scrollBy(-1, -1);
答案 2 :(得分:0)
添加或删除overlayItem时,需要在MarkerOverlay类中调用populate()。
答案 3 :(得分:0)
使用
MapController.notifyRepaint();