如何制作多个图标叠加层仅在Google Maps MapView上的某个缩放级别后显示?

时间:2012-07-04 01:43:29

标签: android overlay zoom android-mapview overlay-icon-disappear

在使用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;
}

}

1 个答案:

答案 0 :(得分:1)

我真的很喜欢使用Android的 OverlayManager 库。它为Google地图代码添加了一些功能,使一些事情变得更加容易。 Find it here包括some demo code that uses it

选项#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:现在,仅仅为此目的使用Overlay Manager库可能会有点过分。因此,另一种可能更简单的方法是以described in this stack overflow answer的方式创建缩放监听器。 Kurru提供的代码将在您的Map课程中提供。您可以在答案的代码中替换它:

checkMapIcons();

用上面显示的方法:

setOverlayVisibility();

所以,现在你有两种方式来观察&#34;缩放级别和覆盖ItemOverlay.draw()允许您随时使标记消失(在此示例中缩放级别&lt; 18)。