如何使多个图标叠加仅在谷歌地图地图视图上的某个缩放级别后显示


在使用

地图API方面,我是初学者,所以请耐心等待,我知道还有许多其他帖子处理同样的问题,但我仍然卡住了。

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

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

编辑:

到目前为止,这是我成功执行的两个类(在应用答案后):

地图.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;
}
}

项目覆盖.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;
}
}

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

选项 #1:如果您使用它,那么您可以将 OverlayManager 的手势侦听器界面用于您的 MapActivity,以接收每个缩放(入/缩小)事件的回调。

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:现在,仅出于此目的使用覆盖管理器库可能是矫枉过正。 因此,另一种可能更简单的替代方法是按照此堆栈溢出答案中所述的方式创建缩放侦听器。 Kurru提供的代码将进入您的Map类。 您将在答案的代码中替换它:

checkMapIcons();

使用我上面显示的方法:

setOverlayVisibility();

因此,现在您有两种方法来"监视"缩放级别,并且覆盖ItemOverlay.draw()允许您随时使标记消失(在本例中缩放级别<18)。

最新更新