diff options
author | Tobrun <tobrun@mapbox.com> | 2016-04-20 17:25:26 +0200 |
---|---|---|
committer | Tobrun <tobrun@mapbox.com> | 2016-04-23 07:16:37 +0200 |
commit | b7c4919e7f1fe44ff5b023866f70520e83142882 (patch) | |
tree | 8d80c5925ed4601a99e51ffd15a0462d875b2712 | |
parent | f469cee1b4f39137264ebae277ab405d1e3e7c3b (diff) | |
download | qtlocation-mapboxgl-b7c4919e7f1fe44ff5b023866f70520e83142882.tar.gz |
[android] #4396 - UserLocationView accuracy & non-tracking animation + cleanup
4 files changed, 142 insertions, 175 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java index 467b1f97e0..4c09402924 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java @@ -1,7 +1,5 @@ package com.mapbox.mapboxsdk.maps.widgets; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; @@ -22,10 +20,10 @@ import android.support.annotation.FloatRange; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; +import android.support.v4.view.animation.FastOutLinearInInterpolator; import android.util.AttributeSet; import android.util.Log; import android.view.View; -import android.view.animation.Animation; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -46,23 +44,32 @@ import java.lang.ref.WeakReference; */ public class UserLocationView extends View { + private UserLocationBehaviour userLocationBehaviour; + private MapboxMap mapboxMap; + private Projection projection; + private int maxSize; + private int[] contentPadding = new int[4]; + + private Location location; private LatLng latLng; + private LatLng interpolatedLocation; + private LatLng previousLocation; + private long locationUpdateTimestamp; + private float gpsDirection; private float compassDirection; + private float previousDirection; + + private float accuracy = 0; + private Paint accuracyPaint = new Paint(); + + private ValueAnimator locationChangeAnimator; + private ValueAnimator accuracyAnimator; private Drawable foregroundDrawable; private Drawable foregroundBearingDrawable; private Drawable backgroundDrawable; - private int[] contentPadding = new int[4]; - - private MyBearingListener mBearingChangeListener; - - // Accuracy - private Paint accuracyPaint; - private int maxAccuracy = 100; - private float accuracy = 0; - private Rect foregroundBounds; private Rect backgroundBounds; @@ -71,29 +78,14 @@ public class UserLocationView extends View { private int backgroundOffsetRight; private int backgroundOffsetBottom; - private UserLocationBehaviour userLocationBehaviour; - @MyLocationTracking.Mode private int myLocationTrackingMode; @MyBearingTracking.Mode private int myBearingTrackingMode; - private MapboxMap mapboxMap; - private Projection projection; - - private Location location; - private UserLocationListener userLocationListener; - - private ValueAnimator locationChangeAnimator; - private MarkerCoordinateAnimatorListener markerCoordinateAnimatorListener; - public LatLng interpolatedLocation; - public LatLng previousLocation; - - private float previousDirection; - - private long locationUpdateTimestamp; - private long locationUpdateDuration; + private GpsLocationListener userLocationListener; + private CompassListener compassListener; public UserLocationView(Context context) { super(context); @@ -113,21 +105,21 @@ public class UserLocationView extends View { private void init(Context context) { setEnabled(false); + // behavioural model userLocationBehaviour = new UserLocationBehaviourFactory().getBehaviouralModel(MyLocationTracking.TRACKING_NONE); - markerCoordinateAnimatorListener = new MarkerCoordinateAnimatorListener(userLocationBehaviour); - - accuracyPaint = new Paint(); - accuracyPaint.setColor(ContextCompat.getColor(context, R.color.mapbox_blue)); - accuracyPaint.setAlpha(100); + compassListener = new CompassListener(context); + maxSize = (int) context.getResources().getDimension(R.dimen.userlocationview_size); + // default implementation setShadowDrawable(ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_shadow)); setForegroundDrawables(ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_normal), ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_bearing)); - mBearingChangeListener = new MyBearingListener(context); + accuracyPaint.setColor(ContextCompat.getColor(context, R.color.mapbox_blue)); + accuracyPaint.setAlpha(100); } public final void setForegroundDrawables(Drawable defaultDrawable, Drawable bearingDrawable) { if (defaultDrawable.getIntrinsicWidth() != bearingDrawable.getIntrinsicWidth() || defaultDrawable.getIntrinsicHeight() != bearingDrawable.getIntrinsicHeight()) { - throw new RuntimeException("Default and bearing drawable dimensions should be match"); + throw new RuntimeException("The dimensions from location and bearing drawables should be match"); } foregroundDrawable = defaultDrawable; foregroundBearingDrawable = bearingDrawable; @@ -186,10 +178,10 @@ public class UserLocationView extends View { int horizontalOffset = backgroundOffsetLeft - backgroundOffsetRight; int verticalOffset = backgroundOffsetTop - backgroundOffsetBottom; - int accurancyWidth = 2 * maxAccuracy; + int accuracyWidth = 2 * maxSize; - backgroundBounds = new Rect(accurancyWidth - (backgroundWidth / 2) + horizontalOffset, accurancyWidth + verticalOffset - (backgroundWidth / 2), accurancyWidth + (backgroundWidth / 2) + horizontalOffset, accurancyWidth + (backgroundHeight / 2) + verticalOffset); - foregroundBounds = new Rect(accurancyWidth - (foregroundWidth / 2), accurancyWidth - (foregroundHeight / 2), accurancyWidth + (foregroundWidth / 2), accurancyWidth + (foregroundHeight / 2)); + backgroundBounds = new Rect(accuracyWidth - (backgroundWidth / 2) + horizontalOffset, accuracyWidth + verticalOffset - (backgroundWidth / 2), accuracyWidth + (backgroundWidth / 2) + horizontalOffset, accuracyWidth + (backgroundHeight / 2) + verticalOffset); + foregroundBounds = new Rect(accuracyWidth - (foregroundWidth / 2), accuracyWidth - (foregroundHeight / 2), accuracyWidth + (foregroundWidth / 2), accuracyWidth + (foregroundHeight / 2)); // invoke a new measure invalidate(); @@ -199,13 +191,16 @@ public class UserLocationView extends View { protected void onDraw(Canvas canvas) { super.onDraw(canvas); - // Not ready yet - if (foregroundBounds == null || backgroundBounds == null) { + if (location == null || foregroundBounds == null || backgroundBounds == null || accuracyAnimator == null) { + // Not ready yet return; } // Draw circle - canvas.drawCircle(foregroundBounds.centerX(), foregroundBounds.centerY(), foregroundBounds.width() / 2 + (accuracy / 100 * (getWidth() - foregroundBounds.width()) / 2), accuracyPaint); + float metersPerPixel = (float) projection.getMetersPerPixelAtLatitude(location.getLatitude()); + float accuracyPixels = (Float) accuracyAnimator.getAnimatedValue() / metersPerPixel; + float maxRadius = getWidth() / 2; + canvas.drawCircle(foregroundBounds.centerX(), foregroundBounds.centerY(), accuracyPixels <= maxRadius ? accuracyPixels : maxRadius, accuracyPaint); // Draw shadow if (backgroundDrawable != null) { @@ -217,15 +212,8 @@ public class UserLocationView extends View { if (foregroundDrawable != null) { foregroundDrawable.draw(canvas); } - } else { - // todo optimise - if (foregroundBearingDrawable != null && foregroundBounds != null) { - if (myBearingTrackingMode == MyBearingTracking.GPS) { - getRotateDrawable(foregroundBearingDrawable, gpsDirection).draw(canvas); - } else { - getRotateDrawable(foregroundBearingDrawable, compassDirection).draw(canvas); - } - } + } else if (foregroundBearingDrawable != null && foregroundBounds != null) { + getRotateDrawable(foregroundBearingDrawable, myBearingTrackingMode == MyBearingTracking.COMPASS ? compassDirection : gpsDirection).draw(canvas); } } @@ -257,30 +245,25 @@ public class UserLocationView extends View { backgroundDrawable.setBounds(backgroundBounds); } - setMeasuredDimension(4 * maxAccuracy, 4 * maxAccuracy); + setMeasuredDimension(4 * maxSize, 4 * maxSize); } public void setTilt(@FloatRange(from = 0, to = 60.0f) double tilt) { setRotationX((float) tilt); } - public void setAccuracy(float accuracy) { - this.accuracy = accuracy; - invalidate(); - } - void updateOnNextFrame() { mapboxMap.invalidate(); } public void onPause() { - mBearingChangeListener.onPause(); + compassListener.onPause(); toggleGps(false); } public void onResume() { if (myBearingTrackingMode == MyBearingTracking.COMPASS) { - mBearingChangeListener.onResume(); + compassListener.onResume(); } if (isEnabled()) { toggleGps(true); @@ -323,7 +306,7 @@ public class UserLocationView extends View { } if (userLocationListener == null) { - userLocationListener = new UserLocationListener(this); + userLocationListener = new GpsLocationListener(this); } locationServices.addLocationListener(userLocationListener); @@ -347,15 +330,15 @@ public class UserLocationView extends View { } this.location = location; - userLocationBehaviour.update(location); + userLocationBehaviour.updateLatLng(location); } public void setMyBearingTrackingMode(@MyBearingTracking.Mode int myBearingTrackingMode) { this.myBearingTrackingMode = myBearingTrackingMode; if (myBearingTrackingMode == MyBearingTracking.COMPASS) { - mBearingChangeListener.onResume(); + compassListener.onResume(); } else { - mBearingChangeListener.onPause(); + compassListener.onPause(); if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { // always face north gpsDirection = 0; @@ -373,10 +356,11 @@ public class UserLocationView extends View { if (myLocationTrackingMode != MyLocationTracking.TRACKING_NONE && location != null) { // center map directly if we have a location fix - userLocationBehaviour.update(location); + userLocationBehaviour.updateLatLng(location); mapboxMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(location))); } invalidate(); + update(); } private void setCompass(float bearing) { @@ -391,6 +375,8 @@ public class UserLocationView extends View { } compassDirection = newDir; invalidate(); + } else { + compassDirection = 0; } } @@ -406,15 +392,14 @@ public class UserLocationView extends View { contentPadding = padding; } - private static class UserLocationListener implements LocationListener { + private static class GpsLocationListener implements LocationListener { private WeakReference<UserLocationView> mUserLocationView; - public UserLocationListener(UserLocationView userLocationView) { + public GpsLocationListener(UserLocationView userLocationView) { mUserLocationView = new WeakReference<>(userLocationView); } - /** * Callback method for receiving location updates from LocationServices. * @@ -429,7 +414,7 @@ public class UserLocationView extends View { } } - private class MyBearingListener implements SensorEventListener { + private class CompassListener implements SensorEventListener { private boolean paused; private SensorManager mSensorManager; @@ -443,14 +428,13 @@ public class UserLocationView extends View { private float[] mOrientation = new float[3]; private float mCurrentDegree = 0f; - // Controls the sensor update rate in milliseconds + // Controls the sensor updateLatLng rate in milliseconds private static final int UPDATE_RATE_MS = 300; // Compass data - private float mCompassBearing; private long mCompassUpdateNextTimestamp = 0; - public MyBearingListener(Context context) { + public CompassListener(Context context) { mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); @@ -492,62 +476,57 @@ public class UserLocationView extends View { SensorManager.getOrientation(mR, mOrientation); float azimuthInRadians = mOrientation[0]; - mCompassBearing = (float) (Math.toDegrees(azimuthInRadians) + 360) % 360; - if (mCompassBearing < 0) { + float compassBearing = (float) (Math.toDegrees(azimuthInRadians) + 360) % 360; + if (compassBearing < 0) { // only allow positive degrees - mCompassBearing += 360; + compassBearing += 360; } - if (mCompassBearing > mCurrentDegree + 15 || mCompassBearing < mCurrentDegree - 15) { - mCurrentDegree = mCompassBearing; + if (compassBearing > mCurrentDegree + 15 || compassBearing < mCurrentDegree - 15) { + mCurrentDegree = compassBearing; setCompass(mCurrentDegree); } } mCompassUpdateNextTimestamp = currentTime + UPDATE_RATE_MS; } + public float getCurrentDegree() { + return mCurrentDegree; + } + + public boolean isPaused() { + return paused; + } + @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { - // TODO add accuracy to the equiation } } private class MarkerCoordinateAnimatorListener implements ValueAnimator.AnimatorUpdateListener { private UserLocationBehaviour behaviour; - private double mFromLat; - private double mFromLng; - private double mToLat; - private double mToLng; + private double fromLat; + private double fromLng; + private double toLat; + private double toLng; - private double mCurrentLat; - private double mCurrentLon; - - private MarkerCoordinateAnimatorListener(UserLocationBehaviour behaviour) { - this.behaviour = behaviour; + private MarkerCoordinateAnimatorListener(UserLocationBehaviour userLocationBehaviour, LatLng from, LatLng to) { + behaviour = userLocationBehaviour; + fromLat = from.getLatitude(); + fromLng = from.getLongitude(); + toLat = to.getLatitude(); + toLng = to.getLongitude(); } @Override public void onAnimationUpdate(ValueAnimator animation) { float frac = animation.getAnimatedFraction(); - double latitude = mFromLat + (mToLat - mFromLat) * frac; - double longitude = mFromLng + (mToLng - mFromLng) * frac; - behaviour.update(latitude, longitude); - mCurrentLat = latitude; - mCurrentLon = longitude; + double latitude = fromLat + (toLat - fromLat) * frac; + double longitude = fromLng + (toLng - fromLng) * frac; + behaviour.updateLatLng(latitude, longitude); updateOnNextFrame(); } - - public LatLng getLatLng() { - return new LatLng(mCurrentLat, mCurrentLon); - } - - public void update() { - mFromLat = mCurrentLat; - mFromLng = mCurrentLon; - mToLat = interpolatedLocation.getLatitude(); - mToLng = interpolatedLocation.getLongitude(); - } } private class UserLocationBehaviourFactory { @@ -563,22 +542,35 @@ public class UserLocationView extends View { private abstract class UserLocationBehaviour { - abstract void update(@NonNull Location location); + abstract void updateLatLng(@NonNull Location location); - public void update(double lat, double lon) { + public void updateLatLng(double lat, double lon) { if (latLng != null) { latLng.setLatitude(lat); latLng.setLongitude(lon); } } + protected void updateAccuracy(@NonNull Location location) { + if (accuracyAnimator != null && accuracyAnimator.isRunning()) { + // use current accuracy as a starting point + accuracy = (Float) accuracyAnimator.getAnimatedValue(); + accuracyAnimator.end(); + } + + accuracyAnimator = ValueAnimator.ofFloat(accuracy, location.getAccuracy()); + accuracyAnimator.setDuration(750); + accuracyAnimator.start(); + accuracy = location.getAccuracy(); + } + abstract void invalidate(); } private class UserLocationTrackingBehaviour extends UserLocationBehaviour { @Override - void update(@NonNull Location location) { + void updateLatLng(@NonNull Location location) { if (latLng == null) { // first location fix latLng = new LatLng(location); @@ -586,7 +578,7 @@ public class UserLocationView extends View { return; } - // update timestamp + // updateLatLng timestamp long previousUpdateTimeStamp = locationUpdateTimestamp; locationUpdateTimestamp = SystemClock.elapsedRealtime(); @@ -608,17 +600,19 @@ public class UserLocationView extends View { CameraPosition.Builder builder = new CameraPosition.Builder().target(interpolatedLocation); // add direction - if (myBearingTrackingMode == MyBearingTracking.GPS){ - if(location.hasBearing()) { + if (myBearingTrackingMode == MyBearingTracking.GPS) { + if (location.hasBearing()) { builder.bearing(location.getBearing()); gpsDirection = 0; } + } else if (myBearingTrackingMode == MyBearingTracking.COMPASS) { + if (!compassListener.isPaused()) { + builder.bearing(compassListener.getCurrentDegree()); + compassDirection = 0; + } } - // add accuracy - if (location.hasAccuracy()) { - accuracy = location.getAccuracy(); - } + updateAccuracy(location); // animate to new camera mapboxMap.easeCamera(CameraUpdateFactory.newCameraPosition(builder.build()), (int) locationUpdateDuration, null); @@ -630,87 +624,57 @@ public class UserLocationView extends View { UiSettings uiSettings = mapboxMap.getUiSettings(); setX((uiSettings.getWidth() - getWidth() + mapPadding[0] - mapPadding[2]) / 2 + (contentPadding[0] - contentPadding[2]) / 2); setY((uiSettings.getHeight() - getHeight() - mapPadding[3] + mapPadding[1]) / 2 + (contentPadding[1] - contentPadding[3]) / 2); + UserLocationView.this.invalidate(); } } private class UserLocationShowBehaviour extends UserLocationBehaviour { @Override - void update(@NonNull final Location location) { - + void updateLatLng(@NonNull final Location location) { if (latLng == null) { - // first location update + // first location updateLatLng latLng = new LatLng(location); locationUpdateTimestamp = SystemClock.elapsedRealtime(); return; } - // update location + // update LatLng location previousLocation = latLng; latLng = new LatLng(location); - // calculate update time + // update LatLng direction + if (location.hasBearing()) { + gpsDirection = clamp(location.getBearing() - (float) mapboxMap.getCameraPosition().bearing); + } + + // update LatLng accuracy + updateAccuracy(location); + + // calculate updateLatLng time + add some extra offset to improve animation long previousUpdateTimeStamp = locationUpdateTimestamp; locationUpdateTimestamp = SystemClock.elapsedRealtime(); - locationUpdateDuration = locationUpdateTimestamp - previousUpdateTimeStamp; + long locationUpdateDuration = (long) ((locationUpdateTimestamp - previousUpdateTimeStamp) * 1.2); // calculate interpolated entity interpolatedLocation = new LatLng((latLng.getLatitude() + previousLocation.getLatitude()) / 2, (latLng.getLongitude() + previousLocation.getLongitude()) / 2); - Log.v("TAG", "LOCATIONS " + previousLocation + " " + interpolatedLocation); - - - if (locationChangeAnimator == null) { - Log.v("TAG", "START"); - locationChangeAnimator = ValueAnimator.ofFloat(1.0f); -// locationChangeAnimator.setRepeatMode(ValueAnimator.RESTART); -// locationChangeAnimator.setRepeatCount(ValueAnimator.INFINITE); - locationChangeAnimator.setDuration(locationUpdateDuration + 500); - - markerCoordinateAnimatorListener = new MarkerCoordinateAnimatorListener(this); - markerCoordinateAnimatorListener.update(); - locationChangeAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - Log.v("TAG", "END"); - markerCoordinateAnimatorListener.update(); - } - - @Override - public void onAnimationRepeat(Animator animation) { - super.onAnimationRepeat(animation); - Log.v("TAG", "REPEAT@"); - markerCoordinateAnimatorListener.update(); - } - - @Override - public void onAnimationStart(Animator animation) { - super.onAnimationStart(animation); - Log.v("TAG","START"); - } - }); - locationChangeAnimator.addUpdateListener(markerCoordinateAnimatorListener); - } else { - Log.v("TAG", "CONTINUE"); - markerCoordinateAnimatorListener.update(); -// long currentPlayTime = locationChangeAnimator.getCurrentPlayTime(); -// locationChangeAnimator.setDuration(locationChangeAnimator.getDuration()+locationUpdateTimestamp); -// locationChangeAnimator.setCurrentPlayTime(currentPlayTime); + // animate changes + if (locationChangeAnimator != null) { + locationChangeAnimator.end(); + locationChangeAnimator = null; } - if (location.hasBearing()) { - gpsDirection = clamp(location.getBearing() - (float) mapboxMap.getCameraPosition().bearing); - } - - if (location.hasAccuracy()) { - accuracy = location.getAccuracy(); - } - - if (!locationChangeAnimator.isRunning()) { - locationChangeAnimator.start(); - } + locationChangeAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); + locationChangeAnimator.setDuration((long) (locationUpdateDuration * 1.2)); + locationChangeAnimator.addUpdateListener(new MarkerCoordinateAnimatorListener(this, + previousLocation, interpolatedLocation + )); + locationChangeAnimator.setInterpolator(new FastOutLinearInInterpolator()); + locationChangeAnimator.start(); + // use interpolated location as current location + latLng = interpolatedLocation; } private float clamp(float direction) { @@ -731,10 +695,7 @@ public class UserLocationView extends View { setX((screenLocation.x - getWidth() / 2)); setY((screenLocation.y - getHeight() / 2)); } + UserLocationView.this.invalidate(); } } - - public class Anim extends Animation{ - - } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml index d98b69eca1..a48a4f14b3 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml @@ -9,6 +9,7 @@ <dimen name="ten_dp">10dp</dimen> <dimen name="sixteen_dp">16dp</dimen> <dimen name="seventy_six_dp">76dp</dimen> + <dimen name="userlocationview_size">64dp</dimen> <dimen name="userlocationview_inner_circle">18dp</dimen> <dimen name="userlocationview_outer_circle">22dp</dimen> </resources> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java index 27763ad4ae..52f20b0666 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/userlocation/MyLocationTrackingModeActivity.java @@ -4,6 +4,7 @@ import android.location.Location; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StringDef; import android.support.design.widget.Snackbar; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; @@ -50,7 +51,6 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements } mMapView = (MapView) findViewById(R.id.mapView); - mMapView.setAccessToken(getString(R.string.mapbox_access_token)); mMapView.onCreate(savedInstanceState); mMapView.getMapAsync(new OnMapReadyCallback() { @Override @@ -58,7 +58,7 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements mMapboxMap = mapboxMap; MyLocationViewSettings locationViewSettings = mapboxMap.getMyLocationViewSettings(); - locationViewSettings.setPadding(0, (int) getResources().getDimension(R.dimen.locationview_padding_top), 0, 0); + locationViewSettings.setPadding(0, (int) getResources().getDimension(R.dimen.locationview_padding_top), 0, 0); mapboxMap.setOnMyLocationChangeListener(MyLocationTrackingModeActivity.this); @@ -126,6 +126,10 @@ public class MyLocationTrackingModeActivity extends AppCompatActivity implements desc += String.format("Alt = %.0f m ", mLocation.getAltitude()); noInfo = false; } + if(mLocation.hasAccuracy()){ + desc += String.format("Acc = %.0f m",mLocation.getAccuracy()); + } + if (noInfo) { desc += "No extra info"; } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_tracking.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_tracking.xml index 699fa4be6b..46ac0e312a 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_tracking.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_my_location_tracking.xml @@ -42,6 +42,7 @@ android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" + app:access_token="@string/mapbox_access_token" app:style_url="@string/style_mapbox_streets" app:zoom="15" /> |