2010-02-24 3 views

Antwort

0

Die einzige Möglichkeit, die ich mir vorstellen kann, ist das MapView zu erweitern und das OnTouchEvent zu überschreiben und auf die Up-Aktion zu achten. Dies wird Ihnen sagen, dass der Benutzer die Bewegung beendet hat und Sie können die Lat/Lon-Spanne erhalten, um die Region zu bestimmen, die Sie auschecken sollten.

+0

Dies funktioniert nicht, wenn der Benutzer die Karte schleudert, da die Karte nach der UP-Aktion abgerechnet wird – Dori

4

try mapview-Overlay-Manager ist es eine Erweiterung für Überlagerungsschicht für Android Karten,

es hat einige vereinfachte OnGestureListener, einige Beispiele:

onSingleTap(MotionEvent, ManagedOverlay, GeoPoint, OverlayItem) 

onDoubleTap(MotionEvent, ManagedOverlay, GeoPoint, OverlayItem) 

onLongPress(MotionEvent, ManagedOverlay, GeoPoint, OverlayItem) 

onZoom(ZoomEvent, ManagedOverlay) 

onScrolled(...) 

Link: http://code.google.com/p/mapview-overlay-manager/ hoffe, es

1
hilft

Leider gibt es keine integrierte Funktionalität in den MapView-Tools (ein merkwürdiges Versehen, da diese Funktionalität im JavaScript SDK sowie im iOS SDK ist).

Sie können dies jedoch problemlos bewältigen, indem Sie ein Runnable verwenden und nur MapView abfragen. Ich tue dies, indem der „letzte“ Zustand zu halten Spur:

getLatitudeSpan(); 
getLongitudeSpan(); 
getCenter(); 
getZoomLevel(); 

Und dann sie zu den aktuellen Werten zu vergleichen. Wenn die Werte geändert wurden, wissen Sie, dass die Kartenansicht verschoben wurde. Wenn nicht, können Sie nichts tun.

Wie auch immer, planen Sie die Runnable für einen weiteren Lauf nach 500ms oder so neu und wiederholen Sie den Vorgang. Sie können OnResume() und OnPause() verwenden, um den Rückruf für das Runnable zu entfernen und es bei Bedarf neu zu starten.

+1

"Leider gibt es keine eingebaute Funktionalität in den MapView-Tools" nein, die onLayout-Methode behandelt dies ziemlich anmutig, siehe meine Antwort für ein Beispiel. –

1

Die MapView-Klasse kann Änderungen mithilfe der onLayout-Methode verfolgen.

heißt

class CustomMapView extends MapView { 

    protected void onLayout(boolean changed,int left, int right, int top, int bottom){ 
     super.onLayout(changed,left, right, top, bottom); 
     if(changed){ 
     // do something special 
     } 
    } 
} 
+2

Testen auf Gingerbread für drei Karteninteraktionen (PAN mit Finger, ZOOM über Steuerelemente, PINCH/REVERSE PINCH mit zwei Fingern), das habe ich: 1) PAN: Es gibt mehrere onLayout Events mit geändert = true 2) ZOOM: da ist ein Event mit changed = true, mehrere Events mit changed = false 3) PINCH/REVERSE PINCH: es gibt keine Events mit changed = true, mehrere Events mit changed = false. Mit dieser Methode können Sie einfache PAN mit Finger/ZOOM über Steuerelemente erkennen, aber Sie können keine Änderungen mit PINCH/REVERSE PINCH erkennen. – Theo

3

Sie können eine SimpleMapView erstellen, die MapView erstreckt.

public class SimpleMapView extends MapView { 

    private int currentZoomLevel = -1; 
    private GeoPoint currentCenter; 
    private List<ZoomChangeListener> zoomEvents = new ArrayList<ZoomChangeListener>(); 
    private List<PanChangeListener> panEvents = new ArrayList<PanChangeListener>(); 

    public SimpleMapView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public SimpleMapView(Context context, String apiKey) { 
     super(context, apiKey); 
    } 

    public SimpleMapView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    /** 
    * 
    * @return 
    */ 
    public int[][] getBounds() { 

     GeoPoint center = getMapCenter(); 
     int latitudeSpan = getLatitudeSpan(); 
     int longtitudeSpan = getLongitudeSpan(); 
     int[][] bounds = new int[2][2]; 

     bounds[0][0] = center.getLatitudeE6() - (latitudeSpan/2); 
     bounds[0][1] = center.getLongitudeE6() - (longtitudeSpan/2); 

     bounds[1][0] = center.getLatitudeE6() + (latitudeSpan/2); 
     bounds[1][1] = center.getLongitudeE6() + (longtitudeSpan/2); 
     return bounds; 
    } 

    public boolean onTouchEvent(MotionEvent ev) { 
     if (ev.getAction() == MotionEvent.ACTION_UP) { 
      GeoPoint centerGeoPoint = this.getMapCenter(); 
      if (currentCenter == null || 
        (currentCenter.getLatitudeE6() != centerGeoPoint.getLatitudeE6()) || 
        (currentCenter.getLongitudeE6() != centerGeoPoint.getLongitudeE6())) { 
       firePanEvent(currentCenter, this.getMapCenter()); 
      } 
      currentCenter = this.getMapCenter(); 
     } 
     return super.onTouchEvent(ev); 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 
     if(getZoomLevel() != currentZoomLevel){ 
      fireZoomLevel(currentZoomLevel, getZoomLevel()); 
      currentZoomLevel = getZoomLevel(); 
     } 
    } 

    @Override 
    public void setSatellite(boolean on){ 
     super.setSatellite(on); 
    } 

    @Override 
    public MapController getController(){ 
     return super.getController(); 
    } 

    private void fireZoomLevel(int old, int current){ 
     for(ZoomChangeListener event : zoomEvents){ 
      event.onZoom(old, current); 
     } 
    } 

    private void firePanEvent(GeoPoint old, GeoPoint current){ 
     for(PanChangeListener event : panEvents){ 
      event.onPan(old, current); 
     } 
    } 

    public void addZoomChangeListener(ZoomChangeListener listener){ 
     this.zoomEvents.add(listener); 
    } 

    public void addPanChangeListener(PanChangeListener listener){ 
     this.panEvents.add(listener); 
    } 
} 

Sie haben die Listener Sie können den Code für Pan oder Zoom setzen. Dann in Ihrem xml:

<com.androidnatic.maps.SimpleMapView android:clickable="true" 
        android:layout_height="match_parent" android:id="@+id/mapView" 
        android:layout_width="match_parent" 
        android:apiKey="xxx"> 
</com.androidnatic.maps.SimpleMapView> 

Und dann in Ihrem Code können Sie die Pan Listener angeben:

mapView.addPanChangeListener(new PanChangeListener() { 

      @Override 
      public void onPan(GeoPoint old, GeoPoint current) { 
          //TODO 
         } 
     }); 
0

alte Frage, aber ich schrieb eine Klasse eine Weile zurück ExMapView genannt, die ein Ereignis ausgelöst wird, wenn Die Kartenregion beginnt sich zu ändern (onRegionBeginChange) und wenn sie sich nicht mehr ändert (onRegionEndChange). Diese Klasse ist für den alten MapView und nicht für V2.0 gedacht. Hoffe es hilft jemandem.

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapView; 

public class ExMapView extends MapView { 
    private static final String TAG = ExMapView.class.getSimpleName(); 
    private static final int DURATION_DEFAULT = 700; 

    private OnRegionChangedListener onRegionChangedListener; 
    private GeoPoint previousMapCenter; 
    private int previousZoomLevel; 
    private int changeDuration; // This is the duration between when the user stops moving the map around and when the onRegionEndChange event fires. 
    private boolean isTouched = false; 
    private boolean regionChanging = false; 

    private Runnable onRegionEndChangeTask = new Runnable() { 
     public void run() { 
      regionChanging = false; 
      previousMapCenter = getMapCenter(); 
      previousZoomLevel = getZoomLevel(); 
      if (onRegionChangedListener != null) { 
       onRegionChangedListener.onRegionEndChange(ExMapView.this, previousMapCenter, previousZoomLevel); 
      } 
     } 
    }; 

    public ExMapView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public ExMapView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public ExMapView(Context context, String apiKey) { 
     super(context, apiKey); 
     init(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     isTouched = event.getAction() != MotionEvent.ACTION_UP; 
     return super.onTouchEvent(event); 
    } 

    @Override 
    public void computeScroll() { 
     super.computeScroll(); 

     // If the map region is still changing (user is still scrolling or zooming), reset timer for onRegionEndChange. 
     if ((!isTouched && !getMapCenter().equals(previousMapCenter)) || (previousZoomLevel != getZoomLevel())) { 

      // If the region has just begun changing, fire off onRegionBeginChange event. 
      if (!regionChanging) { 
       regionChanging = true; 
       if (onRegionChangedListener != null) { 
        onRegionChangedListener.onRegionBeginChange(this, previousMapCenter, previousZoomLevel); 
       } 
      } 

      // Reset timer for onRegionEndChange. 
      removeCallbacks(onRegionEndChangeTask); 
      postDelayed(onRegionEndChangeTask, changeDuration); 
     } 
    } 

    private void init() { 
     changeDuration = DURATION_DEFAULT; 
     previousMapCenter = getMapCenter(); 
     previousZoomLevel = getZoomLevel(); 
    } 

    public void setOnRegionChangedListener(OnRegionChangedListener listener) { 
     onRegionChangedListener = listener; 
    } 

    public void setChangeDuration(int duration) { 
     changeDuration = duration; 
    } 

    public interface OnRegionChangedListener { 
     public abstract void onRegionBeginChange(ExMapView exMapView, GeoPoint geoPoint, int zoomLevel); 
     public abstract void onRegionEndChange(ExMapView exMapView, GeoPoint geoPoint, int zoomLevel); 
    } 
} 
Verwandte Themen