summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTobrun <tobrun.van.nuland@gmail.com>2016-01-05 15:50:51 +0100
committerTobrun <tobrun@mapbox.com>2016-01-05 16:10:17 +0100
commitf80673b15c9961f089c7f341a577517f2d2aaa6c (patch)
tree5f48321e3f1354b036d2b13b3dfda8b91b752ac2 /platform
parent522a88560bee66fd2b54b181fab9b3805a15f6e9 (diff)
downloadqtlocation-mapboxgl-f80673b15c9961f089c7f341a577517f2d2aaa6c.tar.gz
[android] #3397 - animating change of direction when tracking mode is follow user
Diffstat (limited to 'platform')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java60
1 files changed, 50 insertions, 10 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java
index 47339ed297..8e7e550d8f 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java
@@ -26,6 +26,8 @@ import android.view.View;
import android.view.ViewGroup;
import com.mapbox.mapboxsdk.R;
+import com.mapbox.mapboxsdk.camera.CameraPosition;
+import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
import com.mapbox.mapboxsdk.geometry.LatLng;
@@ -78,6 +80,9 @@ final class UserLocationView extends View implements LocationListener {
private float mMarkerAccuracy;
private ObjectAnimator mMarkerAccuracyAnimator;
+ private LatLng mCurrentMapViewCoordinate;
+ private double mCurrentBearing;
+
private boolean mPaused = false;
private Location mUserLocation;
@@ -238,6 +243,7 @@ final class UserLocationView extends View implements LocationListener {
if (myLocationTrackingMode != MyLocationTracking.TRACKING_NONE && mUserLocation != null) {
// center map directly if we have a location fix
+ mMarkerCoordinate = new LatLng(mUserLocation.getLatitude(), mUserLocation.getLongitude());
mMapView.setCenterCoordinate(new LatLng(mUserLocation));
}
}
@@ -268,9 +274,35 @@ final class UserLocationView extends View implements LocationListener {
mMarkerScreenMatrix.setTranslate(
mMarkerScreenPoint.x,
mMarkerScreenPoint.y);
+
} else if (mMyLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) {
- mMarkerScreenMatrix.setTranslate(getMeasuredWidth() / 2, getMeasuredHeight() / 2);
- mMapView.setCenterCoordinate(mMarkerCoordinate, true);
+ float bearing;
+ if (mShowDirection) {
+ bearing = mMyBearingTrackingMode == MyBearingTracking.COMPASS ? mBearingChangeListener.getCompassBearing() : mGpsMarkerDirection;
+ } else {
+ bearing = (float) mMapView.getBearing();
+ }
+
+ if (mCurrentMapViewCoordinate == null) {
+ mCurrentMapViewCoordinate = mMapView.getCenterCoordinate();
+ }
+
+ // only update if there is an actual change
+ if ((!mCurrentMapViewCoordinate.equals(mMarkerCoordinate)) || (!(mCurrentBearing == bearing))) {
+ CameraPosition cameraPosition = new CameraPosition.Builder()
+ .target(mMarkerCoordinate)
+ .bearing(bearing)
+ .build();
+ mMapView.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 300, null);
+ mMarkerScreenMatrix.reset();
+ mMarkerScreenMatrix.setTranslate(
+ getMeasuredWidth() / 2,
+ getMeasuredHeight() / 2);
+
+ // set values for next check for actual change
+ mCurrentMapViewCoordinate = mMarkerCoordinate;
+ mCurrentBearing = bearing;
+ }
}
// rotate so arrow in points to bearing
@@ -357,7 +389,7 @@ final class UserLocationView extends View implements LocationListener {
if (myBearingTrackingMode == MyBearingTracking.COMPASS) {
mShowAccuracy = false;
- mShowDirection = false;
+ mShowDirection = true;
mBearingChangeListener.onStart(getContext());
} else {
mBearingChangeListener.onStop();
@@ -367,6 +399,7 @@ final class UserLocationView extends View implements LocationListener {
mShowDirection = false;
}
}
+ update();
}
@MyBearingTracking.Mode
@@ -411,7 +444,7 @@ final class UserLocationView extends View implements LocationListener {
}
public float getCompassBearing() {
- return mCompassBearing;
+ return mCurrentDegree;
}
@Override
@@ -438,11 +471,19 @@ final class UserLocationView extends View implements LocationListener {
SensorManager.getOrientation(mR, mOrientation);
float azimuthInRadians = mOrientation[0];
float azimuthInDegress = (float) (Math.toDegrees(azimuthInRadians) + 360) % 360;
- mCompassBearing = mCurrentDegree;
- mCurrentDegree = -azimuthInDegress;
+
+ mCompassBearing = azimuthInDegress;
+ if (mCompassBearing < 0) {
+ // only allow positive degrees
+ mCompassBearing += 360;
+ }
+
+ if (mCompassBearing > mCurrentDegree + 15 || mCompassBearing < mCurrentDegree - 15) {
+ mCurrentDegree = mCompassBearing;
+ setCompass(mCurrentDegree);
+ }
}
mCompassUpdateNextTimestamp = currentTime + UPDATE_RATE_MS;
- setCompass(mCompassBearing);
}
@Override
@@ -465,7 +506,7 @@ final class UserLocationView extends View implements LocationListener {
}
private boolean isStale(Location location) {
- if (location != null) {
+ if (location != null && mMyBearingTrackingMode != MyBearingTracking.COMPASS) {
long ageInNanos;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
ageInNanos = SystemClock.elapsedRealtimeNanos() -
@@ -529,7 +570,6 @@ final class UserLocationView extends View implements LocationListener {
} else {
// moving map under the tracker
mMarkerCoordinate = new LatLng(location);
- mMapView.setCenterCoordinate(mMarkerCoordinate, true);
}
if (mMyLocationTrackingMode == MyLocationTracking.TRACKING_NONE && mMyBearingTrackingMode == MyBearingTracking.GPS) {
@@ -603,7 +643,7 @@ final class UserLocationView extends View implements LocationListener {
mShowDirection = true;
mGpsMarkerDirection = 0;
mCompassMarkerDirection = 0;
- mMapView.setBearing(bearing, BEARING_DURATION);
+ update();
}
}
}