Search code examples
androidanimationcameragoogle-maps-api-2

Android Google Maps v2 Camera Animation


So im not sure if this is a bug or not yet... might be or I may have missed something.

Anyway so here is the link to Google Maps V2 Camera Controls. https://developers.google.com/maps/documentation/android/views#moving_the_camera

The issue :

Animate to a location already animated to does not call onFinish();

How to replicate:

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");


                    }
                }); 

This issue may well come about when a user double taps something which called the same animation even if there is a long time between, onFinish will only be called for a successful animation. When the camera is already positioned the onFinish method will not be called!

I could go around doing checks before I do any camera animation but I don't like that as its wasteful.

Any help would be appreciated. Thanks.


Solution

  • I have the same problem when i want to move camera to the same position, it seems like a bug. Even if old and new position are not the same and the difference is so small , ex: old position.latitude = 94.54284009112, new position.latitude = 94.54284003451, it dosen't work. my solution is to truncate values to get only old_position.latitude = new_position.latitude = 94.54, then i do a test.

    There is another problem with moving camera and scroll the map in the same time, for that i disable scroll gesture before moving and enable it on the onFinish() and the 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);
    
                }
            });
        }
    
    }
    

    Hope this helps you ;)