1

在使用 Maps API 时,我是初学者,所以请多多包涵,我知道还有很多其他帖子处理相同的问题,但我仍然卡住了。

  • 我已经能够在我的地图上放置一些叠加图像。我现在唯一遇到的问题是,当我缩小足够的级别时,我不知道如何使它们消失,因为这会导致叠加图像挤在一起并重叠 - 基本上使它们在那个级别无用。因此,对于如何使它们出现(在缩放级别 18 之后)的任何帮助将不胜感激。

  • 我曾尝试使用缩放侦听器和 if 语句,但它没有任何变化 - 很可能是因为我不知道我需要在哪里实现它和/或启用它需要哪些其他方法。另外,我不确定如何实现 draw() 方法,因为许多其他人已经使用它来使其缩放和消失。

编辑:

这些是我迄今为止成功执行的两个类(在应用答案之后):

Map.java文件

public class Map extends com.google.android.maps.MapActivity implements
    OnOverlayGestureListener {

private boolean mShowOverlays = true;
private MapView mMapView;
MapView mapView;
MapController mapController;

private void setOverlayVisibility() {
    boolean showOverlays = mMapView.getZoomLevel() > 18;
    if (showOverlays != mShowOverlays) {
        mShowOverlays = showOverlays;
        for (Overlay overlay : mMapView.getOverlays()) {
            if (overlay instanceof ItemOverlay) {
                ((ItemOverlay) overlay).setVisible(showOverlays);
            }
        }
    }

}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapController = mapView.getController();
    mapController.setZoom(17);

    boolean showOverlays = mMapView.getZoomLevel() > 18;

    List<Overlay> mapOverlays = mapView.getOverlays();
    Drawable lot = this.getResources().getDrawable(R.drawable.lot);
    ItemOverlay parking_lot = new ItemOverlay(lot, this);
    GeoPoint point1 = new GeoPoint(43806622, -79219797);
    OverlayItem parking = new OverlayItem(point1, "Shopping Center","Parking Lot");

    parking_lot.addOverlayItems(parking);
    mapOverlays.add(parking_lot);

    Drawable logo = this.getResources().getDrawable(R.drawable.entrance);
    ItemOverlay ent = new ItemOverlay(logo, this);
    GeoPoint start = new GeoPoint(43805697, -79221031);
    mapController.setCenter(start);
    OverlayItem welcome = new OverlayItem(start, "Welcome", " ");

    ent.addOverlayItems(welcome);
    mapOverlays.add(ent);

    public <ZoomEvent> boolean onZoom(ZoomEvent ze, ManagedOverlay mo) {
        setOverlayVisibility();    
        return true;
    }

}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

}

ItemOverlay.java文件

public class ItemOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
private boolean visible = true;

private boolean mVisible = true;

    public void setVisible(boolean value) {
       mVisible = value;
    }
    public boolean isVisible() {
       return mVisible ;
    }

    @Override
    public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
        if (mVisible) {
            super.draw(canvas, mapView, shadow);
        }
     }

public ItemOverlay(Drawable defaultMarker, Context context) {
    super(boundCenterBottom(defaultMarker));
    // TODO Auto-generated constructor stub
    mContext = context;
}

public void addOverlayItems(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

@Override
protected OverlayItem createItem(int i) {
    // TODO Auto-generated method stub
    return mOverlays.get(i);

}

@Override
public int size() {
    // TODO Auto-generated method stub
    return mOverlays.size();
}

@Override
protected boolean onTap(int index) {
    // TODO Auto-generated method stub
    OverlayItem item = mOverlays.get(index);
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
    dialog.setTitle(item.getTitle());
    dialog.setMessage(item.getSnippet());
    dialog.show();
    return true;
}

}
4

1 回答 1

1

我真的很喜欢使用 Android 的OverlayManager库。它为 Google 地图代码添加了一些功能,并使一些事情变得更容易。 在这里找到它,包括一些使用它的演示代码

选项#1:如果你使用它,那么你可以为你的 MapActivity 使用 OverlayManager 的手势监听器接口,接收每个缩放(in/out)事件的回调。

public class Map extends MapActivity implements OnOverlayGestureListener 
{ 
    private boolean mShowOverlays = true;
    private MapView mMapView;     // assign this in onCreate()

    private void setOverlayVisibility() {
        boolean showOverlays = mMapView.getZoomLevel() >= 18;
        if (showOverlays != mShowOverlays) {
           mShowOverlays = showOverlays;
           for (Overlay overlay : mMapView.getOverlays()) { 
              if (overlay instanceof ItemOverlay) { 
                 ((ItemOverlay)overlay).setVisible(showOverlays); 
              } 
           } 
        }
    }

    // this is the onOverlayGestureListener callback:
    public boolean onZoom(ZoomEvent ze, ManagedOverlay mo) {
        setOverlayVisibility();    
        return true;
    }
}

您还必须将您的Map实例添加为带有ManagedOverlay.setOnOverlayGestureListener(). 请参阅示例代码。

最后,在您的 ItemOverlay 类中,您可以覆盖该draw()方法,并根据覆盖是否已标记为可见有选择地绘制。您需要添加一个自定义visible属性:

public class ItemOverlay extends ItemizedOverlay {

    private boolean mVisible = true;

    public void setVisible(boolean value) {
       mVisible = value;
    }
    public boolean isVisible() {
       return mVisible ;
    }

    @Override
    public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
       if (mVisible) {
           super.draw(canvas, mapView, shadow);
       }
    }
 }

选项 #2:现在,仅出于这一目的使用 Overlay Manager 库可能是矫枉过正。因此,另一种可能更简单的替代方法是按照此堆栈溢出答案中描述的方式创建缩放侦听器。Kurru 提供的代码会出现在你的课堂上。您将在答案的代码中替换它:Map

checkMapIcons();

使用我上面展示的方法:

setOverlayVisibility();

所以,现在你有两种方法来“观察”缩放级别,覆盖ItemOverlay.draw()允许你让标记在你喜欢的时候消失(在这个例子中缩放级别 < 18)。

于 2012-07-04T02:30:17.630 回答