Wie man diese Karte fängt und das Zoom ist wirklich fertig?

Ich versuche, eine Anwendung zu schreiben, die dynamisch Daten auf Karte lädt, während der Benutzer schwenkt oder zoomt.

Ich muss nachverfolgen, wenn die Karte fertig ist, um ihren Ansichtszustand zu ändern (stoppt das Schwenken oder Zoomen) und lädt dann einen neuen Teil der Daten zum Erstellen von Markierungen. Aber in der Tat Google Maps API hat keine Veranstaltungen, um dies zu behandeln.

  • Benutzerdefinierte infowindow mit Google Maps api v2
  • Wie man den Alarm zurücksetzt, wenn die App in Androide geschlossen ist
  • Autostart Android-Anwendung nach der Installation abgeschlossen
  • Wie kann ich den Speicher für Android Emulator erhöhen? (INSTALLATION FEHLGESCHLAGEN, MANGELNDER SPEICHER)
  • Warum sind Hunderte von Bitmaps im Speicher für eine grundlegende Android-App?
  • Zusammenfassung: Nehmen Sie ein Bild mit Kameraabsicht und zeigen Sie das Foto mit korrekter Ausrichtung an (arbeitet auf hoffentlich alle Geräte)
  • Es gibt einige Methoden wie das Erstellen eines leeren Overlays, um onTouch Events zu steuern, und so weiter, aber das Karten-Panning könnte lange dauern, bis der Benutzer seine Berührung beendet hat, weil GMaps irgendeine Art von Trägheit verwenden, um die Wanne glatter zu machen.

    Ich habe versucht zu subclass MapView aber seine draw() Methode ist final also kann es nicht überschrieben werden.

    Irgendwelche Ideen, wie man die präzise Handhabung von Pan- und Zoom-Finish macht?

  • Android windowSoftInputMode = "adjustPan" blättert noch mehr
  • Der UI-Designer konnte nicht im neuen Android Studio gefunden werden
  • Aufblasendes Layout auf ListItem basierend auf ListItem spezifische Variable
  • Lesen Sie die Schriftgröße unter Einstellungen
  • Google Play API-Rückgabefehler 401
  • Android Genymotion VM Logcat läuft in Endlosschleife
  • 2 Solutions collect form web for “Wie man diese Karte fängt und das Zoom ist wirklich fertig?”

    Stunden der Erforschung und einige Entscheidung wurde gefunden. Es hat einige Nachteile und Profis, die ich weiter beschreiben werde.

    Die Hauptsache, die wir tun sollten, ist, einige MapView-Methoden zu überschreiben, um sein Zeichnungsverhalten zu behandeln. Falls wir die draw () -Methode nicht überschreiben können, sollten wir einen anderen Weg finden. Es gibt noch eine Ableitung von View, die überschrieben werden kann – computeScroll () -Methode. Es wird wiederholt aufgerufen, da die Karte die Polsterung fortsetzt. Alles, was wir tun müssen, ist, eine Zeitschwelle zu setzen, um zu fangen, wenn computeScroll nicht mehr dieses Mal angerufen wird.
    Hier ist was ich tat:

     import java.util.Timer; import java.util.TimerTask; 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 EnhancedMapView extends MapView { public interface OnZoomChangeListener { public void onZoomChange(MapView view, int newZoom, int oldZoom); } public interface OnPanChangeListener { public void onPanChange(MapView view, GeoPoint newCenter, GeoPoint oldCenter); } private EnhancedMapView _this; // Set this variable to your preferred timeout private long events_timeout = 500L; private boolean is_touched = false; private GeoPoint last_center_pos; private int last_zoom; private Timer zoom_event_delay_timer = new Timer(); private Timer pan_event_delay_timer = new Timer(); private EnhancedMapView.OnZoomChangeListener zoom_change_listener; private EnhancedMapView.OnPanChangeListener pan_change_listener; public EnhancedMapView(Context context, String apiKey) { super(context, apiKey); _this = this; last_center_pos = this.getMapCenter(); last_zoom = this.getZoomLevel(); } public EnhancedMapView(Context context, AttributeSet attrs) { super(context, attrs); } public EnhancedMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setOnZoomChangeListener(EnhancedMapView.OnZoomChangeListener l) { zoom_change_listener = l; } public void setOnPanChangeListener(EnhancedMapView.OnPanChangeListener l) { pan_change_listener = l; } @Override public boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() == 1) { is_touched = false; } else { is_touched = true; } return super.onTouchEvent(ev); } @Override public void computeScroll() { super.computeScroll(); if (getZoomLevel() != last_zoom) { // if computeScroll called before timer counts down we should drop it and start it over again zoom_event_delay_timer.cancel(); zoom_event_delay_timer = new Timer(); zoom_event_delay_timer.schedule(new TimerTask() { @Override public void run() { zoom_change_listener.onZoomChange(_this, getZoomLevel(), last_zoom); last_zoom = getZoomLevel(); } }, events_timeout); } // Send event only when map's center has changed and user stopped touching the screen if (!last_center_pos.equals(getMapCenter()) || !is_touched) { pan_event_delay_timer.cancel(); pan_event_delay_timer = new Timer(); pan_event_delay_timer.schedule(new TimerTask() { @Override public void run() { pan_change_listener.onPanChange(_this, getMapCenter(), last_center_pos); last_center_pos = getMapCenter(); } }, events_timeout); } } } 

    Dann sollten Sie Event-Handler in Ihrer MapActivity so registrieren:

     public class YourMapActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mv = new EnhancedMapView(this, "<your Maps API key here>"); mv.setClickable(true); mv.setBuiltInZoomControls(true); mv.setOnZoomChangeListener(new EnhancedMapView.OnZoomChangeListener() { @Override public void onZoomChange(MapView view, int newZoom, int oldZoom) { Log.d("test", "zoom changed from " + oldZoom + " to " + newZoom); } } mv.setOnPanChangeListener(new EnhancedMapView.OnPanChangeListener() { public void onPanChange(MapView view, GeoPoint newCenter, GeoPoint oldCenter) { Log.d("test", "center changed from " + oldCenter.getLatitudeE6() + "," + oldCenter.getLongitudeE6() + " to " + newCenter.getLatitudeE6() + "," + newCenter.getLongitudeE6()); } } } 

    Was ist mit Vor- und Nachteilen dieses Ansatzes?
    Vorteile:
    – Ereignisse behandelt entweder Wegkarte wurde verschoben oder gezoomt. Touch-Event, Hardware-Tasten verwendet, auch programmgesteuerte Ereignisse werden behandelt (wie setZoom () oder animate () Methoden).
    – Möglichkeit, unnötiges Laden von Daten zu überspringen, wenn der Benutzer die Zoomtaste mehrmals schnell klickt. Das Ereignis wird nur ausgelöst, nachdem die Klicks aufgehört haben.
    Nachteile:
    – Es ist ganz einfach nicht möglich, das Zoomen oder Panning-Action abzubrechen (vielleicht werde ich diese Fähigkeit in die Zukunft hinzufügen)

    Hoffe, diese kleine Klasse wird dir helfen.

    Das MapChange- Projekt, das ursprünglich auf eine ähnliche Frage hier geschrieben wurde , half mir, die gleiche Aufgabe zu erfüllen, die du gefragt hast.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.