Me gustaría tener onZoomListener en mi MapView.
El siguiente código es lo que he hecho. Se registra si el zoom botones están intervenidos. Dado que todos los nuevos teléfonos ahora es compatible con pellizcar para ampliar, esto es inútil. ¿Alguien tiene idea de cómo hacer real onZoomListener? Gracias.

   OnZoomListener listener = new OnZoomListener() {
   @Override
   public void onVisibilityChanged(boolean arg0) {
    //TODO Auto-generated method stub

   }
   @Override
   public void onZoom(boolean arg0) {
    Log.d(TAG, "ZOOM CHANGED");
    //TODO Auto-generated method stub

   }
  };

  ZoomButtonsController zoomButton = mapView.getZoomButtonsController();
  zoomButton.setOnZoomListener(listener);

OriginalEl autor bobetko | 2011-01-18

8 Comentarios

  1. 25

    Me había subclase MapView y reemplazar dispatchDraw

    Aquí está el código:

     int oldZoomLevel=-1;
     @Override
     public void dispatchDraw(Canvas canvas) {
      super.dispatchDraw(canvas);
      if (getZoomLevel() != oldZoomLevel) {
       Log.d(TAG, "ZOOOMED");
       oldZoomLevel = getZoomLevel();
      }
     }

    Este blog me ha ayudado mucho: http://pa.rezendi.com/2010/03/responding-to-zooms-and-pans-in.html

    Por encima de las grandes obras. Hay tal vez la solución más sencilla?
    Traté de implementar onTouchListener en MapView directamente, pero eventos de toque se detecta sólo una vez si onTouchListener devolverá false. Si se devolverá true, el tacto se detecta cada vez, pero el mapa zoom y panorámica no iba a funcionar.

    OriginalEl autor bobetko

  2. 11

    Pongo todo el código de arriba juntos y se acercó con esta clase:

    
    package at.blockhaus.wheels.map;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapView;
    public class CustomMapView extends MapView {
    private int oldZoomLevel = -1;
    private GeoPoint oldCenterGeoPoint;
    private OnPanAndZoomListener mListener;
    public CustomMapView(Context context, String apiKey) {
    super(context, apiKey);
    }
    public CustomMapView(Context context, AttributeSet attrs) {
    super(context, attrs);
    }
    public CustomMapView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    }
    public void setOnPanListener(OnPanAndZoomListener listener) {
    mListener = listener;
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_UP) {
    GeoPoint centerGeoPoint = this.getMapCenter();
    if (oldCenterGeoPoint == null || 
    (oldCenterGeoPoint.getLatitudeE6() != centerGeoPoint.getLatitudeE6()) ||
    (oldCenterGeoPoint.getLongitudeE6() != centerGeoPoint.getLongitudeE6()) ) {
    mListener.onPan();
    }
    oldCenterGeoPoint = this.getMapCenter();
    }
    return super.onTouchEvent(ev);
    }
    @Override
    protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    if (getZoomLevel() != oldZoomLevel) {
    mListener.onZoom();
    oldZoomLevel = getZoomLevel();
    }
    }
    }
     
    

    Y la correspondiente escucha de interfaz:

    
    package at.blockhaus.wheels.map;
    public interface OnPanAndZoomListener {
    public void onPan();
    public void onZoom();
    }
     
    

    OriginalEl autor vinzenzweber

  3. 0

    Edit: creo que lo que he encontrado es probablemente el único mecanismo para permitir que esta detección. (La edición de mi post para eliminar la desinformación) Ampliación de la MapView y la invalidación de la onDraw() método de trabajo. Una consideración que se debe tomar se con qué frecuencia fuego el código escuchar zoom. Por ejemplo, mientras que el zoom de la onDraw puede ser llamado decenas de veces, cada una con un diferente nivel de zoom. Esto puede provocar un mal funcionamiento si el detector está funcionando todo el tiempo. Usted podría estrangular a este mediante la determinación de que un zoom de cambio ha tenido lugar y, a continuación, a la espera para el nivel de zoom a ser el mismo en los dos posteriores vuelve a dibujar antes de disparar el evento. Todo esto depende de cómo usted quiere que su código para ser llamado.

    OriginalEl autor Nick Campion

  4. 0

    uso dispatchTouch() método para detectar eventos de toque en el mapa y asegúrese de llamar a la super() método para llevar a cabo el mapa predeterminado funciones táctiles. (Configuración de la onTouchListener deshabilitar la integrada de eventos como el zoom y panorámica si el retorno de la verdad de su functiion, y se encargan de tocar sólo una vez si devuelve false.)

    en dispatchTouch método, usted puede comprobar el número de puntos de contacto por el uso de eventos.getPointerCount(). uso Action_UP para detectar si el usuario ha conseguido o no llamando a mapview.getZoomLevel(); si usted encuentra el nivel de zoom cambiado, usted puede llevar a cabo sus acciones.

    OriginalEl autor rDroid

  5. 0

    he implementado de la siguiente manera, y lo que funciona para una sola/multitouch :

    @Override
    protected void dispatchDraw(Canvas canvas) {
    //TODO Auto-generated method stub
    super.dispatchDraw(canvas);
    if (oldZoomLevel == -1) {
    oldZoomLevel = getZoomLevel();
    }
    if (oldZoomLevel < getZoomLevel()) {
    System.out.println("zoomed in");
    if (mOnZoomInListener != null) {
    mOnZoomInListener
    .onZoomedIn(this, oldZoomLevel, getZoomLevel());
    }
    }
    if (oldZoomLevel > getZoomLevel()) {
    System.out.println("zoomed out");
    if (mOnZoomOutListener != null) {
    mOnZoomOutListener.onZoomedOut(this, oldZoomLevel,
    getZoomLevel());
    }
    }

    A mí me funcionó!

    OriginalEl autor rDroid

  6. 0

    Intenta a través de este método

    map.setMapListener(new MapListener()
    {
    ....
    @Override
    public boolean onZoom(ZoomEvent event)
    {
    return false;
    }
    });

    OriginalEl autor Axrorxo’ja Yodgorov

  7. -7

    MapView proporciona construir-en los controles de zoom de apoyo pizca.
    Si no funciona fuera de la caja, usted podría tratar de establecer mapView.setBuiltInZoomControls(true);
    De esta manera usted no debería necesitar la OnZoomListener.

    Yo no tengo problema con que muestra el control del zoom. Necesito generar un evento cuando el zoom se producen.

    OriginalEl autor ShadowMare

Dejar respuesta

Please enter your comment!
Please enter your name here