¿Cómo hacer que las superposiciones de múltiples íconos solo aparezcan después de un cierto nivel de zoom en Google Maps MapView?

Soy un principiante cuando se trata de trabajar con la API de Maps, así que tengan paciencia conmigo y sé que ha habido muchas otras publicaciones que tratan el mismo problema, pero todavía estoy atascado.

  • He podido colocar algunas imágenes superpuestas en mi mapa. El único problema que tengo ahora es que no sé cómo hacer que desaparezcan cuando alejo los niveles suficientes, ya que esto hace que las imágenes superpuestas se amontonen y se superpongan, básicamente haciéndolas inútiles en ese nivel. Por lo tanto, cualquier ayuda sobre cómo hacer que aparezcan (después del nivel de zoom 18) sería realmente apreciada.

  • Intenté usar un oyente de zoom y una declaración if, pero no hubo cambios, muy probablemente porque no sé exactamente dónde necesito implementarlo y/o qué otros métodos se requieren para habilitarlo. Además, no estoy seguro de cómo implementar el método draw(), ya que muchos otros lo han usado para escalarlo y desaparecer.

Edit:

Estas son las dos clases que tengo hasta ahora que se ejecutan con éxito (después de aplicar la respuesta):

El Mapa.java archivo:

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;
}

}

El ItemOverlay.java archivo:

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;
}

}

preguntado el 04 de julio de 12 a las 02:07

1 Respuestas

Realmente me gusta usar el Administrador de superposición biblioteca para Android. Agrega funciones al código de Google Maps y facilita algunas cosas. Encuéntralo aquí incluso algún código de demostración que lo usa

Opción #1: Si usa esto, puede usar la interfaz de escucha de gestos de OverlayManager para su MapActivity, para recibir una devolución de llamada para cada evento de zoom (acercar/alejar).

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;
    }
}

Tendrás que añadir también tu Map instancia como un oyente de gestos con ManagedOverlay.setOnOverlayGestureListener(). Vea el código de muestra para eso.

Finalmente, en su clase ItemOverlay, puede anular el draw() y dibujar de forma selectiva en función de si la superposición se ha marcado como visible o no. Necesitas agregar un personalizado visible propiedad:

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);
       }
    }
 }

Opción #2: Ahora, usar la biblioteca Overlay Manager solo para este propósito podría ser excesivo. Entonces, otra alternativa, probablemente más simple, es crear un zoom oyente en la forma descrito en esta respuesta de desbordamiento de pila. El código que proporciona Kurru iría en su Map clase. Reemplazarías esto en el código de la respuesta:

checkMapIcons();

con el método que mostré arriba:

setOverlayVisibility();

Entonces, ahora tiene dos formas de "observar" el nivel de zoom y anular ItemOverlay.draw() te permite hacer desaparecer los marcadores cuando quieras (nivel de zoom < 18 en este ejemplo).

contestado el 23 de mayo de 17 a las 13:05

Entonces, antes que nada, gracias por las rápidas respuestas y comentarios. Ahora, cuando agregué el código sugerido, está claro que requiere las otras clases de OverlayManagerdemo, así que antes de continuar, ¿debería crear y copiar TODAS las clases utilizadas en la demostración porque en este momento veo que ZoomEvent no está definido en el código como es .. - TK_

Entonces, después de ver su opción 2, vi que tiene mucho más sentido y es más fácil de aplicar. Una vez que sugerí todo el código, todo parecía estar bien, pero cuando ejecuté el emulador, inició el mapa pero luego "se detuvo inesperadamente" de inmediato. No estoy muy seguro de dónde está causando un conflicto... - TK_

Conseguí que funcionara con la Opción 2, ¡es increíble! Solo tuve que cambiar una de mis variables para aceptar los parámetros de entrada correctos (de mMapView a mapView). Funciona justo como quería. Muchas gracias, Nate. Realmente aprecio tomarme el tiempo para ayudar a los principiantes como yo. - TK_

@TK_, de nada. En el desbordamiento de pila, si obtiene una solución que resuelve el problema, les gusta que la marque como resuelta marcando la pequeña marca de verificación que aparece junto a la respuesta que lo resolvió por usted. Después de ganar algunos puntos, también puede votar las respuestas con las flechas arriba/abajo junto a cada respuesta. De hecho, puede votar por múltiples respuestas, pero solo puede Aceptar uno. - Nate

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.