2013-02-11 16 views
8

Also ich bin mir nicht sicher, ob das ein Bug ist oder noch nicht ... könnte sein oder ich habe etwas verpasst.Android Google Maps v2 Kameraanimation

Wie auch immer, hier ist der Link zu Google Maps V2 Camera Controls. https://developers.google.com/maps/documentation/android/views#moving_the_camera

Das Problem:

Animate zu einem Ort animiert schon nicht nennen OnFinish();

Wie replizieren:

mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mLocation.getLatLng(), zoomLevel), 200, new GoogleMap.CancelableCallback() { 

        @Override 
        public void onFinish() { 
         //DO some stuff here! 
        Log.d("animation", "onFinishCalled"); 

        } 

        @Override 
        public void onCancel() { 
        Log.d("animation", "onCancel"); 


        } 
       }); 

Dieses Problem zu kann auch kommen, wenn ein Benutzer etwas doppelte Hähne, die die gleiche Animation auch genannt, wenn es für eine erfolgreiche zwischen OnFinish werden Animationen nur aufgerufen, ist eine lange Zeit . Wenn die Kamera bereits positioniert ist, wird die onFinish-Methode nicht aufgerufen!

Ich könnte Kontrollen machen, bevor ich irgendeine Kameraanimation mache, aber ich mag das nicht als verschwenderisch.

Jede Hilfe wäre willkommen. Danke.

+0

bisher ist die einzige Alternative zu moveCamera statt animateCamera, aber BOOOO zu diesem. –

Antwort

15

Ich habe das gleiche Problem, wenn ich die Kamera an die gleiche Position verschieben möchte, scheint es wie ein Fehler. Auch wenn die alte und die neue Position nicht gleich sind und der Unterschied so klein ist, zB: alte position.latitude = 94.54284009112, neue position.latitude = 94.54284003451, funktioniert es nicht. meine Lösung ist, Werte zu schneiden, um nur old_position.latitude = new_position.latitude = 94.54 zu bekommen, dann mache ich einen Test.

Es gibt ein anderes Problem mit der Kamera zu bewegen und die Karte gleichzeitig zu scrollen, dafür deaktiviere ich die Scroll-Geste vor dem Verschieben und aktiviere sie auf onFinish() und onCancel().

public void animateCameraTo(final double lat, final double lng) 
{ 
    _googleMap = getMap(); 
    CameraPosition camPosition = _googleMap.getCameraPosition(); 
    if (!((Math.floor(camPosition.target.latitude * 100)/100) == (Math.floor(lat * 100)/100) && (Math.floor(camPosition.target.longitude * 100)/100) == (Math.floor(lng * 100)/100))) 
    { 
     _googleMap.getUiSettings().setScrollGesturesEnabled(false); 
     _googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lng)), new CancelableCallback() 
     { 

      @Override 
      public void onFinish() 
      { 
       _googleMap.getUiSettings().setScrollGesturesEnabled(true); 

      } 

      @Override 
      public void onCancel() 
      { 
       _googleMap.getUiSettings().setAllGesturesEnabled(true); 

      } 
     }); 
    } 

} 

hoffe das hilft dir;)

+2

good work around, ich würde aber auf mindestens 4 Dezimalstellen runtergehen! 2 Dezimalstellen auf lat lang ist noch ein recht großer Bereich noch –

+1

Die Rundung von lat/long Werten auf die nächsten 100 ist scheinbar willkürlich und führt je nach Verhalten zu unterschiedlichem Verhalten Zoom-Ebene Eine bessere Lösung würde die Zoom-Stufe beinhalten, um den Betrag zum Runden zu bestimmen. – Graham

0

Die einzige Lösung, die ich gefunden habe, besteht darin, die verschwenderischen Pixelwertüberprüfungen durchzuführen, ein falsches (aber nahes) CameraUpdate-Objekt einzurichten und einen verschachtelten animateCamera() -Aufruf zuerst mit dem falschen CameraUpdate durchzuführen und dann einen anderen cameraUpdate() aufzurufen Zuerst onFinish() mit dem korrekten CameraUpdate. Ich habe heute das Google MAP v2-Update installiert, aber es hat nicht geholfen. Dies ist ein Problem bei der Gerätedrehung für mich. Ich zeige Begrenzungsrechtecke an und der Zentroid ändert sich bei Drehung nicht, so dass animateCamera() nicht funktioniert und wenn das Gerät gedreht wird, kann das ausgewählte Rechteck teilweise vom Bildschirm abweichen.

Haben Sie schon eine andere Lösung gefunden? Danke

+0

Nö, iv verschoben, um moveCamera eher als animateCamera, die irgendwie saugt :( –

+0

Die einzige Alternative, die ich denken kann (ähnlich wie Ihre) ist zu überprüfen, ob die LatLng, die Sie animieren, ist die gleiche wie Kamera Zielposition vor dem Start der Animation. Wenn es Ihre onFinished-Methoden sind, werden Ihre Recen wahrscheinlich ungültig, wenn Sie rotieren. Sehen Sie sich http://developer.android.com/guide/topics/resources/runtime-changes.html an, was helfen könnte –

-1

Hier ist eine andere Abhilfe:

Sie wissen tun, um die Animation Dauer Ihres Kartenanimationen. So können Sie eine verzögerte Runnable mit einer Verzögerung der Animationsdauer + etwas Offset posten und dort können Sie überprüfen, ob der fertige/abgebrochene Listener aufgerufen wurde ... falls nicht, können Sie ihn dort abrufen und den entsprechenden Listener aufrufen

2

Ihr sollte überprüfen Sie die Pixel-Entfernung, nicht die Geo-Abstand:

Verwandte Themen