2011-01-18 20 views
10

Mi piacerebbe avere onZoomListener sul mio MapView. Il codice seguente è quello che ho fatto. Registra se si toccano i pulsanti dello zoom. Dal momento che tutti i nuovi telefoni supportano ora il pizzico per lo zoom, questo è inutile. Qualcuno ha idea di come fare su onZoomListener? Grazie.Come implementare OnZoomListener su 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); 

risposta

25

ho dovuto sottoclasse MapView e sovrascrivere dispatchDraw

Ecco il codice:

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

Questo blog mi ha aiutato molto: http://pa.rezendi.com/2010/03/responding-to-zooms-and-pans-in.html

Sopra grandi opere. C'è forse una soluzione più semplice? Ho tentato di implementare onTouchListener su MapView direttamente, ma l'evento touch sarebbe stato rilevato una sola volta se onTouchListener restituiva false. Se restituisse true, il tocco verrebbe rilevato ogni volta, ma lo zoom e il panning della mappa non funzionerebbero.

0

Edit: Credo che quello che ho trovato è probabilmente l'unico meccanismo per consentire questo rilevamento. (Modifica del mio post per rimuovere informazioni errate) L'estensione di MapView e l'override del metodo onDraw() funzionerebbe. Una considerazione da fare sarà la frequenza con cui sparare il codice ascoltando lo zoom. Ad esempio, mentre lo zoom su onDraw può essere chiamato decine di volte ciascuno con un diverso livello di zoom. Questo potrebbe causare scarse prestazioni se il tuo ascoltatore sta sparando ogni volta. Potresti limitare questo determinando che è stato effettuato un cambio di zoom e poi aspettando che il livello di zoom sia lo stesso su due successivi ridisegni prima di sparare all'evento. Tutto dipende da come vuoi che venga chiamato il tuo codice.

-7

MapView fornisce controlli zoom integrati che supportano il pizzicamento. Se non funziona immediatamente, puoi provare a impostare mapView.setBuiltInZoomControls(true); In questo modo non dovresti aver bisogno di OnZoomListener.

+0

non ho problema con mostrando controllo dello zoom. Devo aumentare un evento quando si verifica lo zoom. – bobetko

11

ho messo tutto il codice dall'alto insieme e si avvicinò con questa classe:

 

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


} 
 

e la corrispondente interfaccia di chi ascolta:

 

package at.blockhaus.wheels.map; 

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

uso dispatchTouch() per rilevare eventi di tocco sulla mappa della città e assicurarsi che si chiama il metodo super() per svolgere le funzioni mappa tocco di default. L'impostazione onTouchListener disabiliterà gli eventi integrati come zoom e panning se si restituisce true dalla funzione e gestirà il tocco una sola volta se si restituisce false.

nel metodo dispatchTouch, è possibile verificare il numero di punti di tocco da utilizzando event.getPointerCount(). utilizzare Action_UP per rilevare se l'utente ha ingrandito o meno chiamando mapview.getZoomLevel(); se trovi il livello di zoom modificato, puoi eseguire le tue azioni.

0

ho implementato nel modo seguente, e funziona per la singola/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()); 
     } 
    } 

ha funzionato per me!

0

Prova tramite questo metodo

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

        @Override 
        public boolean onZoom(ZoomEvent event) 
         { 

          return false; 
         } 
       }); 
Problemi correlati