2011-01-18 13 views
10

me gustaría tener en mi onZoomListener MapView. El siguiente código es lo que he hecho. Se registra si los botones de zoom se tocan. Dado que todos los teléfonos nuevos ahora admiten pellizcar para acercar, esto es inútil. ¿Alguien tiene idea de cómo hacer real en ZoomListener? Gracias.Cómo implemennt OnZoomListener en MapView

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

Respuesta

25

que tenían a la subclase de Mapa y anular 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 ayudó mucho: http://pa.rezendi.com/2010/03/responding-to-zooms-and-pans-in.html

anterior funciona muy bien. ¿Hay alguna solución más simple? me trató de implementar onTouchListener en MapView directamente, sino de eventos táctiles se detectaría una sola vez si onTouchListener volvería falsa. Si fuera verdadero, el tacto se detectaría todas las veces, pero el zoom y la panorámica del mapa no funcionarían.

0

Editar: Creo que lo que ha encontrado es probablemente el único mecanismo que permite esta detección. (Editar mi publicación para eliminar la información errónea) Extendía MapView y reemplazaba el método onDraw(). Una consideración para hacer será la frecuencia con la que se activará el código para escuchar el zoom. Por ejemplo, al hacer zoom, el onDraw se puede llamar docenas de veces, cada uno con un nivel de zoom diferente. Esto puede causar un rendimiento deficiente si su oyente está disparando todo el tiempo. Puede regular esto determinando que se ha producido un cambio de zoom y luego esperando que el nivel de zoom sea el mismo en dos redibujados posteriores antes de disparar el evento. Todo esto depende de cómo quiera que se llame su código.

-7

MapView ofrece construir-en los controles de zoom que apoyan pellizco. Si no funciona fuera de la caja podría intentar configurar mapView.setBuiltInZoomControls(true); esta manera que no es necesario el OnZoomListener.

+0

no tengo problema con que muestra el control del zoom. Necesito plantear un evento cuando ocurre el zoom. – bobetko

11

que poner 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 interfaz de escucha:

 

package at.blockhaus.wheels.map; 

public interface OnPanAndZoomListener { 
    public void onPan(); 
    public void onZoom(); 
} 
 
0

uso dispatchTouch() para detectar eventos táctiles en el mapa y asegúrese de llamar al método super() para realizar las funciones mapa táctiles predeterminados. (El ajuste en TouchListener deshabilitará los eventos incorporados como zoom y paneo si devuelve true desde su función, y manejará touch solo una vez si devuelve falso.)

en el método dispatchTouch, puede verificar que no haya puntos de contacto usando event.getPointerCount(). use Action_UP para detectar si el usuario ha disminuido o no llamando a mapview.getZoomLevel(); si encuentra que el nivel de zoom ha cambiado, puede llevar a cabo sus acciones.

0

he implementado es de la siguiente manera, y funciona para un solo/multi-touch:

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

que trabajó para mí!

0

Trate a través de este método

map.setMapListener(new MapListener() 
       { 
        .... 

        @Override 
        public boolean onZoom(ZoomEvent event) 
         { 

          return false; 
         } 
       });