going from lat/long to mapPixels to lat/long was broken and you didnt end up with the same lat long.
THis was because of 2 things:
- scrollX and scrollY are int which round up the coordinates too much
- there was a mapSize + 0.5 in the method going back from mapPixels to lat/long

So now whenever you can use the method scrollTo(double, double). This store the actual scroll as double.
When needed  (setZoomInternal for instance) we use those non rounded values to compute back the center coordinates
All that work is so that we know if the zoomEvent or scrollEvent was sent after a user action.
The first consequence of that is to correctly stop userLocation following on user action
cleaned up tags
handle actions triggered before the mapView is layed out for the first time
dont trigger an invalidate if the new location is the same as the old one!
animated support to zoomToBoundingBox