Ich erstelle eine Android-App, die nach Elementen sucht, die auf dem sichtbaren Bereich des MapView basieren. Gibt es eine Möglichkeit, einen Listener in meinem MapView einzurichten, um zu erkennen, wann eine Karte verschoben oder gezoomt wurde?Wie kann ich feststellen, ob ein Android MapView geschwenkt oder gezoomt wurde?
Antwort
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.
Dies funktioniert nicht, wenn der Benutzer die Karte schleudert, da die Karte nach der UP-Aktion abgerechnet wird – Dori
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
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.
"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. –
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
}
}
}
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
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
}
});
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);
}
}
- 1. Wie kann ich feststellen, ob ein Bild photoshopped wurde?
- 2. Wie kann ich feststellen, ob ein Realm erfolgreich aktualisiert wurde?
- 3. Wie kann ich feststellen, ob ein UILabel berührt wurde?
- 4. Wie kann ich feststellen, ob ein `NSManagedObject` gelöscht wurde?
- 5. Wie kann ich feststellen, ob ein Popup vollständig geladen wurde?
- 6. Wie kann ich feststellen, ob ein Prozess beendet wurde?
- 7. Kann ich feststellen, ob ein beliebiger CSS-Übergang gestartet wurde?
- 8. xsl: Wie kann ich feststellen, ob eine Variable deklariert wurde?
- 9. Wie kann ich feststellen, ob die Einfügetaste gedrückt wurde?
- 10. Wie kann ich feststellen, ob eine Entität gespeichert wurde?
- 11. Wie kann ich feststellen, ob eine jQuery-Dialogabfrage initialisiert wurde?
- 12. Wie kann ich feststellen, ob ein JEditorPane/TextPane-Dokument oder eine Seite vollständig geladen wurde?
- 13. Wie kann ich feststellen, ob SP1 auf VS2008 installiert wurde?
- 14. Wie kann ich feststellen, ob eine Datei umbenannt wurde?
- 15. Wie kann ich feststellen, ob ein Browser ein Popup blockiert?
- 16. Wie kann ich feststellen, ob eine Anwendung als WebApp oder native Anwendung geschrieben wurde?
- 17. Wie kann ich feststellen, ob ApplyUpdates Daten einfügt oder aktualisiert?
- 18. Wie kann ich feststellen, ob ein erforderliches Modul von einem Edelstein stammt oder ein Kernmodul war?
- 19. Wie kann ich feststellen, ob ich ein Speicherleck habe?
- 20. Wie kann ich feststellen, ob ein Benutzer angemeldet ist?
- 21. Wie kann ich feststellen, ob ein Pthread am Leben ist?
- 22. Wie kann ich feststellen, ob pc.onnegotiationneeded ausgelöst wurde, weil der Stream entfernt wurde?
- 23. Wie kann man feststellen, ob Swift mit Optimization kompiliert wurde?
- 24. Wie kann man feststellen, ob eine Aufgabe synchron ausgeführt wurde?
- 25. Wie kann ich feststellen, ob ein BPM-Prozess erfolgreich war?
- 26. Wie kann ich feststellen, ob ein Paket RTP/RTCP ist?
- 27. Wie kann ich feststellen, ob ein JavaScript-Objekt ein Bild oder ein Canvas ist?
- 28. Wie kann ich feststellen, ob ein MySQL-Prozess blockiert ist?
- 29. Wie kann ich feststellen, ob ein bestimmtes Paket bereits installiert wurde?
- 30. Wie kann ich feststellen, ob ein Ereignis im Vollkalender aktualisiert wurde?
Haben Sie ein Beispiel dafür? –