[android] #4800 - default location view from start: introduced attributes, update MapboxMapOptions, added tests. updated MockParcel

This commit is contained in:
Tobrun
2016-04-25 12:31:07 +02:00
parent ba9703351d
commit e2510fce79
18 changed files with 528 additions and 288 deletions

View File

@@ -3,7 +3,7 @@ package com.mapbox.mapboxsdk.constants;
import android.support.annotation.IntDef;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.widgets.UserLocationView;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationView;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -12,7 +12,7 @@ import java.lang.annotation.RetentionPolicy;
* MyBearingTracking exposes different types bearing tracking modes.
*
* @see MapView#setMyBearingTrackingMode(int)
* @see UserLocationView#setMyBearingTrackingMode(int)
* @see MyLocationView#setMyBearingTrackingMode(int)
*/
public class MyBearingTracking {

View File

@@ -3,7 +3,7 @@ package com.mapbox.mapboxsdk.constants;
import android.support.annotation.IntDef;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.widgets.UserLocationView;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationView;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -12,7 +12,7 @@ import java.lang.annotation.RetentionPolicy;
* MyLocationTracking exposes different types of locational tracking modes.
*
* @see MapView#setMyLocationTrackingMode(int)
* @see UserLocationView#setMyLocationTrackingMode(int)
* @see MyLocationView#setMyLocationTrackingMode(int)
*/
public class MyLocationTracking {
@@ -30,7 +30,7 @@ public class MyLocationTracking {
public static final int TRACKING_NONE = 0x00000000;
/**
* Tracking the location of the user, {@link MapView} will reposition to center of {@link UserLocationView}
* Tracking the location of the user, {@link MapView} will reposition to center of {@link MyLocationView}
*/
public static final int TRACKING_FOLLOW = 0x00000004;

View File

@@ -82,7 +82,8 @@ import com.mapbox.mapboxsdk.layers.CustomLayer;
import com.mapbox.mapboxsdk.location.LocationListener;
import com.mapbox.mapboxsdk.location.LocationServices;
import com.mapbox.mapboxsdk.maps.widgets.CompassView;
import com.mapbox.mapboxsdk.maps.widgets.UserLocationView;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationView;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings;
import com.mapbox.mapboxsdk.telemetry.MapboxEvent;
import com.mapbox.mapboxsdk.telemetry.MapboxEventManager;
import com.mapbox.mapboxsdk.utils.ColorUtils;
@@ -127,7 +128,7 @@ public class MapView extends FrameLayout {
private CompassView mCompassView;
private ImageView mLogoView;
private ImageView mAttributionsView;
private UserLocationView mUserLocationView;
private MyLocationView mMyLocationView;
private CopyOnWriteArrayList<OnMapChangedListener> mOnMapChangedListener;
private ZoomButtonsController mZoomButtonsController;
@@ -224,8 +225,8 @@ public class MapView extends FrameLayout {
// Connectivity
onConnectivityChanged(isConnected());
mUserLocationView = (UserLocationView) view.findViewById(R.id.userLocationView);
mUserLocationView.setMapboxMap(mMapboxMap);
mMyLocationView = (MyLocationView) view.findViewById(R.id.userLocationView);
mMyLocationView.setMapboxMap(mMapboxMap);
mCompassView = (CompassView) view.findViewById(R.id.compassView);
mCompassView.setMapboxMap(mMapboxMap);
@@ -264,6 +265,22 @@ public class MapView extends FrameLayout {
mMapboxMap.setStyleUrl(style);
}
// MyLocationView
MyLocationViewSettings myLocationViewSettings = mMapboxMap.getMyLocationViewSettings();
myLocationViewSettings.setForegroundDrawable(options.getMyLocationForegroundDrawable(), options.getMyLocationForegroundBearingDrawable());
myLocationViewSettings.setBackgroundDrawable(options.getMyLocationBackgroundDrawable());
if(options.getMyLocationForegroundTintColor()!=-1) {
myLocationViewSettings.setForegroundTintColor(options.getMyLocationForegroundTintColor());
}
if(options.getMyLocationBackgroundTintColor()!=-1) {
myLocationViewSettings.setBackgroundTintColor(options.getMyLocationBackgroundTintColor());
}
myLocationViewSettings.setAccuracyAlpha(options.getMyLocationAccuracyAlpha());
myLocationViewSettings.setAccuracyTintColor(options.getMyLocationAccuracyTintColor());
int[] myLocationPadding = options.getMyLocationBackgroundPadding();
if (myLocationPadding != null) {
myLocationViewSettings.setPadding(myLocationPadding[0], myLocationPadding[1], myLocationPadding[2], myLocationPadding[3]);
}
mMapboxMap.setMyLocationEnabled(options.getLocationEnabled());
// Enable gestures
@@ -276,6 +293,8 @@ public class MapView extends FrameLayout {
uiSettings.setRotateGestureChangeAllowed(options.getRotateGesturesEnabled());
uiSettings.setTiltGesturesEnabled(options.getTiltGesturesEnabled());
uiSettings.setTiltGestureChangeAllowed(options.getTiltGesturesEnabled());
// Ui Controls
uiSettings.setZoomControlsEnabled(options.getZoomControlsEnabled());
// Zoom
@@ -525,7 +544,7 @@ public class MapView extends FrameLayout {
getContext().unregisterReceiver(mConnectivityReceiver);
mConnectivityReceiver = null;
mUserLocationView.onPause();
mMyLocationView.onPause();
}
/**
@@ -538,7 +557,7 @@ public class MapView extends FrameLayout {
getContext().registerReceiver(mConnectivityReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
mNativeMapView.update();
mUserLocationView.onResume();
mMyLocationView.onResume();
if (mStyleUrl == null) {
// user has failed to supply a style url
@@ -590,7 +609,7 @@ public class MapView extends FrameLayout {
if (duration != null) {
actualDuration = duration;
}
mUserLocationView.setTilt(pitch);
mMyLocationView.setTilt(pitch);
mNativeMapView.setPitch(pitch, actualDuration);
}
@@ -1329,7 +1348,7 @@ public class MapView extends FrameLayout {
}
mCompassView.update(getDirection());
mUserLocationView.update();
mMyLocationView.update();
for (InfoWindow infoWindow : mMapboxMap.getInfoWindows()) {
infoWindow.update();
}
@@ -1557,7 +1576,7 @@ public class MapView extends FrameLayout {
zoom(true, e.getX(), e.getY());
} else {
// Zoom in on user location view
zoom(true, mUserLocationView.getCenterX(), mUserLocationView.getCenterY());
zoom(true, mMyLocationView.getCenterX(), mMyLocationView.getCenterY());
}
break;
}
@@ -1790,8 +1809,8 @@ public class MapView extends FrameLayout {
mNativeMapView.scaleBy(detector.getScaleFactor(), (getWidth() / 2) / mScreenDensity, (getHeight() / 2) / mScreenDensity);
} else {
// around user location view
float x = mUserLocationView.getX() + mUserLocationView.getWidth() / 2;
float y = mUserLocationView.getY() + mUserLocationView.getHeight() / 2;
float x = mMyLocationView.getX() + mMyLocationView.getWidth() / 2;
float y = mMyLocationView.getY() + mMyLocationView.getHeight() / 2;
mNativeMapView.scaleBy(detector.getScaleFactor(), x / mScreenDensity, y / mScreenDensity);
}
}
@@ -1871,8 +1890,8 @@ public class MapView extends FrameLayout {
detector.getFocusY() / mScreenDensity);
} else {
// around center userlocation
float x = mUserLocationView.getX() + mUserLocationView.getWidth() / 2;
float y = mUserLocationView.getY() + mUserLocationView.getHeight() / 2;
float x = mMyLocationView.getX() + mMyLocationView.getWidth() / 2;
float y = mMyLocationView.getY() + mMyLocationView.getHeight() / 2;
mNativeMapView.setBearing(bearing, x / mScreenDensity, y / mScreenDensity);
}
return true;
@@ -2336,18 +2355,20 @@ public class MapView extends FrameLayout {
//
void setMyLocationEnabled(boolean enabled) {
mUserLocationView.setEnabled(enabled);
mMyLocationView.setEnabled(enabled);
}
Location getMyLocation() {
return mUserLocationView.getLocation();
return mMyLocationView.getLocation();
}
void setOnMyLocationChangeListener(@Nullable final MapboxMap.OnMyLocationChangeListener listener) {
LocationServices.getLocationServices(getContext()).addLocationListener(new LocationListener() {
@Override
public void onLocationChanged(Location location) {
listener.onMyLocationChange(location);
if(listener!=null) {
listener.onMyLocationChange(location);
}
}
});
}
@@ -2356,7 +2377,7 @@ public class MapView extends FrameLayout {
if (myLocationTrackingMode != MyLocationTracking.TRACKING_NONE && !mMapboxMap.isMyLocationEnabled()) {
mMapboxMap.setMyLocationEnabled(true);
}
mUserLocationView.setMyLocationTrackingMode(myLocationTrackingMode);
mMyLocationView.setMyLocationTrackingMode(myLocationTrackingMode);
MapboxMap.OnMyLocationTrackingModeChangeListener listener = mMapboxMap.getOnMyLocationTrackingModeChangeListener();
if (listener != null) {
listener.onMyLocationTrackingModeChange(myLocationTrackingMode);
@@ -2367,7 +2388,7 @@ public class MapView extends FrameLayout {
if (myBearingTrackingMode != MyBearingTracking.NONE && !mMapboxMap.isMyLocationEnabled()) {
mMapboxMap.setMyLocationEnabled(true);
}
mUserLocationView.setMyBearingTrackingMode(myBearingTrackingMode);
mMyLocationView.setMyBearingTrackingMode(myBearingTrackingMode);
MapboxMap.OnMyBearingTrackingModeChangeListener listener = mMapboxMap.getOnMyBearingTrackingModeChangeListener();
if (listener != null) {
listener.onMyBearingTrackingModeChange(myBearingTrackingMode);
@@ -2512,8 +2533,8 @@ public class MapView extends FrameLayout {
mMapboxMap = mapboxMap;
}
UserLocationView getUserLocationView() {
return mUserLocationView;
MyLocationView getUserLocationView() {
return mMyLocationView;
}
@UiThread

View File

@@ -2,17 +2,25 @@ package com.mapbox.mapboxsdk.maps;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.ColorInt;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.utils.ColorUtils;
import java.util.Arrays;
/**
* Defines configuration MapboxMapMapOptions for a MapboxMap. These options can be used when adding a
@@ -56,7 +64,15 @@ public class MapboxMapOptions implements Parcelable {
private boolean zoomGesturesEnabled = true;
private boolean zoomControlsEnabled = false;
private boolean locationEnabled;
private boolean myLocationEnabled;
private Drawable myLocationForegroundDrawable;
private Drawable myLocationForegroundBearingDrawable;
private Drawable myLocationBackgroundDrawable;
private int myLocationForegroundTintColor = -1;
private int myLocationBackgroundTintColor = -1;
private int[] myLocationBackgroundPadding;
private int myLocationAccuracyTintColor;
private int myLocationAccuracyAlpha;
private String style;
private String accessToken;
@@ -93,7 +109,15 @@ public class MapboxMapOptions implements Parcelable {
zoomControlsEnabled = in.readByte() != 0;
zoomGesturesEnabled = in.readByte() != 0;
locationEnabled = in.readByte() != 0;
myLocationEnabled = in.readByte() != 0;
//myLocationForegroundDrawable;
//myLocationForegroundBearingDrawable;
//myLocationBackgroundDrawable;
myLocationForegroundTintColor = in.readInt();
myLocationBackgroundTintColor = in.readInt();
myLocationBackgroundPadding = in.createIntArray();
myLocationAccuracyAlpha = in.readInt();
myLocationAccuracyTintColor = in.readInt();
style = in.readString();
accessToken = in.readString();
@@ -150,6 +174,18 @@ public class MapboxMapOptions implements Parcelable {
, (int) (typedArray.getDimension(R.styleable.MapView_attribution_margin_bottom, DIMENSION_SEVEN_DP) * screenDensity)});
mapboxMapOptions.locationEnabled(typedArray.getBoolean(R.styleable.MapView_my_location_enabled, false));
mapboxMapOptions.myLocationForegroundDrawable(typedArray.getDrawable(R.styleable.MapView_my_location_foreground));
mapboxMapOptions.myLocationForegroundBearingDrawable(typedArray.getDrawable(R.styleable.MapView_my_location_foreground_bearing));
mapboxMapOptions.myLocationBackgroundDrawable(typedArray.getDrawable(R.styleable.MapView_my_location_background));
mapboxMapOptions.myLocationForegroundDrawable(typedArray.getDrawable(R.styleable.MapView_my_location_foreground));
mapboxMapOptions.myLocationForegroundTintColor(typedArray.getColor(R.styleable.MapView_my_location_foreground_tint, -1));
mapboxMapOptions.myLocationBackgroundTintColor(typedArray.getColor(R.styleable.MapView_my_location_background_tint, -1));
mapboxMapOptions.myLocationBackgroundPadding(new int[]{(int) (typedArray.getDimension(R.styleable.MapView_my_location_background_left, 0) * screenDensity)
, (int) (typedArray.getDimension(R.styleable.MapView_my_location_background_top, 0) * screenDensity)
, (int) (typedArray.getDimension(R.styleable.MapView_my_location_background_right, 0) * screenDensity)
, (int) (typedArray.getDimension(R.styleable.MapView_my_location_background_bottom, 0) * screenDensity)});
mapboxMapOptions.myLocationAccuracyAlpha(typedArray.getInt(R.styleable.MapView_my_location_accuracy_alpha, 100));
mapboxMapOptions.myLocationAccuracyTint(typedArray.getColor(R.styleable.MapView_my_location_accuracy_tint, ColorUtils.getAccentColor(context)));
} finally {
typedArray.recycle();
}
@@ -394,7 +430,79 @@ public class MapboxMapOptions implements Parcelable {
* @return This
*/
public MapboxMapOptions locationEnabled(boolean locationEnabled) {
this.locationEnabled = locationEnabled;
this.myLocationEnabled = locationEnabled;
return this;
}
/**
* @param myLocationForegroundDrawable
* @return This
*/
public MapboxMapOptions myLocationForegroundDrawable(Drawable myLocationForegroundDrawable) {
this.myLocationForegroundDrawable = myLocationForegroundDrawable;
return this;
}
/**
* @param myLocationBearingDrawable
* @return This
*/
public MapboxMapOptions myLocationForegroundBearingDrawable(Drawable myLocationBearingDrawable) {
this.myLocationForegroundBearingDrawable = myLocationBearingDrawable;
return this;
}
/**
* @param myLocationBackgroundDrawable
* @return This
*/
public MapboxMapOptions myLocationBackgroundDrawable(Drawable myLocationBackgroundDrawable) {
this.myLocationBackgroundDrawable = myLocationBackgroundDrawable;
return this;
}
/**
* @param myLocationForegroundTintColor
* @return This
*/
public MapboxMapOptions myLocationForegroundTintColor(@ColorInt int myLocationForegroundTintColor) {
this.myLocationForegroundTintColor = myLocationForegroundTintColor;
return this;
}
/**
* @param myLocationBackgroundTintColor
* @return This
*/
public MapboxMapOptions myLocationBackgroundTintColor(@ColorInt int myLocationBackgroundTintColor) {
this.myLocationBackgroundTintColor = myLocationBackgroundTintColor;
return this;
}
/**
* @param myLocationBackgroundPadding
* @return This
*/
public MapboxMapOptions myLocationBackgroundPadding(int[] myLocationBackgroundPadding) {
this.myLocationBackgroundPadding = myLocationBackgroundPadding;
return this;
}
/**
* @param myLocationAccuracyTintColor
* @return This
*/
public MapboxMapOptions myLocationAccuracyTint(@ColorInt int myLocationAccuracyTintColor) {
this.myLocationAccuracyTintColor = myLocationAccuracyTintColor;
return this;
}
/**
* @param alpha
* @return This
*/
public MapboxMapOptions myLocationAccuracyAlpha(@IntRange(from = 0, to = 255) int alpha) {
this.myLocationAccuracyAlpha = alpha;
return this;
}
@@ -580,7 +688,63 @@ public class MapboxMapOptions implements Parcelable {
* @return True and user location will be shown
*/
public boolean getLocationEnabled() {
return locationEnabled;
return myLocationEnabled;
}
/**
* @return
*/
public Drawable getMyLocationForegroundDrawable() {
return myLocationForegroundDrawable;
}
/**
* @return
*/
public Drawable getMyLocationForegroundBearingDrawable() {
return myLocationForegroundBearingDrawable;
}
/**
* @return
*/
public Drawable getMyLocationBackgroundDrawable() {
return myLocationBackgroundDrawable;
}
/**
* @return
*/
public int getMyLocationForegroundTintColor() {
return myLocationForegroundTintColor;
}
/**
* @return
*/
public int getMyLocationBackgroundTintColor() {
return myLocationBackgroundTintColor;
}
/**
* @return
*/
public int[] getMyLocationBackgroundPadding() {
return myLocationBackgroundPadding;
}
/**
* @return
*/
public int getMyLocationAccuracyTintColor() {
return myLocationAccuracyTintColor;
}
/**
* @return
*/
public int getMyLocationAccuracyAlpha() {
return myLocationAccuracyAlpha;
}
/**
@@ -635,9 +799,94 @@ public class MapboxMapOptions implements Parcelable {
dest.writeByte((byte) (zoomControlsEnabled ? 1 : 0));
dest.writeByte((byte) (zoomGesturesEnabled ? 1 : 0));
dest.writeByte((byte) (locationEnabled ? 1 : 0));
dest.writeByte((byte) (myLocationEnabled ? 1 : 0));
//myLocationForegroundDrawable;
//myLocationForegroundBearingDrawable;
//myLocationBackgroundDrawable;
dest.writeInt(myLocationForegroundTintColor);
dest.writeInt(myLocationBackgroundTintColor);
dest.writeIntArray(myLocationBackgroundPadding);
dest.writeInt(myLocationAccuracyAlpha);
dest.writeInt(myLocationAccuracyTintColor);
dest.writeString(style);
dest.writeString(accessToken);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MapboxMapOptions options = (MapboxMapOptions) o;
if (debugActive != options.debugActive) return false;
if (compassEnabled != options.compassEnabled) return false;
if (compassGravity != options.compassGravity) return false;
if (logoEnabled != options.logoEnabled) return false;
if (logoGravity != options.logoGravity) return false;
if (attributionEnabled != options.attributionEnabled) return false;
if (attributionGravity != options.attributionGravity) return false;
if (Float.compare(options.minZoom, minZoom) != 0) return false;
if (Float.compare(options.maxZoom, maxZoom) != 0) return false;
if (rotateGesturesEnabled != options.rotateGesturesEnabled) return false;
if (scrollGesturesEnabled != options.scrollGesturesEnabled) return false;
if (tiltGesturesEnabled != options.tiltGesturesEnabled) return false;
if (zoomGesturesEnabled != options.zoomGesturesEnabled) return false;
if (zoomControlsEnabled != options.zoomControlsEnabled) return false;
if (myLocationEnabled != options.myLocationEnabled) return false;
if (myLocationForegroundTintColor != options.myLocationForegroundTintColor) return false;
if (myLocationBackgroundTintColor != options.myLocationBackgroundTintColor) return false;
if (myLocationAccuracyTintColor != options.myLocationAccuracyTintColor) return false;
if (myLocationAccuracyAlpha != options.myLocationAccuracyAlpha) return false;
if (cameraPosition != null ? !cameraPosition.equals(options.cameraPosition) : options.cameraPosition != null)
return false;
if (!Arrays.equals(compassMargins, options.compassMargins)) return false;
if (!Arrays.equals(logoMargins, options.logoMargins)) return false;
if (!Arrays.equals(attributionMargins, options.attributionMargins)) return false;
if (myLocationForegroundDrawable != null ? !myLocationForegroundDrawable.equals(options.myLocationForegroundDrawable) : options.myLocationForegroundDrawable != null)
return false;
if (myLocationForegroundBearingDrawable != null ? !myLocationForegroundBearingDrawable.equals(options.myLocationForegroundBearingDrawable) : options.myLocationForegroundBearingDrawable != null)
return false;
if (myLocationBackgroundDrawable != null ? !myLocationBackgroundDrawable.equals(options.myLocationBackgroundDrawable) : options.myLocationBackgroundDrawable != null)
return false;
if (!Arrays.equals(myLocationBackgroundPadding, options.myLocationBackgroundPadding))
return false;
if (style != null ? !style.equals(options.style) : options.style != null) return false;
return accessToken != null ? accessToken.equals(options.accessToken) : options.accessToken == null;
}
@Override
public int hashCode() {
int result = cameraPosition != null ? cameraPosition.hashCode() : 0;
result = 31 * result + (debugActive ? 1 : 0);
result = 31 * result + (compassEnabled ? 1 : 0);
result = 31 * result + compassGravity;
result = 31 * result + Arrays.hashCode(compassMargins);
result = 31 * result + (logoEnabled ? 1 : 0);
result = 31 * result + logoGravity;
result = 31 * result + Arrays.hashCode(logoMargins);
result = 31 * result + (attributionEnabled ? 1 : 0);
result = 31 * result + attributionGravity;
result = 31 * result + Arrays.hashCode(attributionMargins);
result = 31 * result + (minZoom != +0.0f ? Float.floatToIntBits(minZoom) : 0);
result = 31 * result + (maxZoom != +0.0f ? Float.floatToIntBits(maxZoom) : 0);
result = 31 * result + (rotateGesturesEnabled ? 1 : 0);
result = 31 * result + (scrollGesturesEnabled ? 1 : 0);
result = 31 * result + (tiltGesturesEnabled ? 1 : 0);
result = 31 * result + (zoomGesturesEnabled ? 1 : 0);
result = 31 * result + (zoomControlsEnabled ? 1 : 0);
result = 31 * result + (myLocationEnabled ? 1 : 0);
result = 31 * result + (myLocationForegroundDrawable != null ? myLocationForegroundDrawable.hashCode() : 0);
result = 31 * result + (myLocationForegroundBearingDrawable != null ? myLocationForegroundBearingDrawable.hashCode() : 0);
result = 31 * result + (myLocationBackgroundDrawable != null ? myLocationBackgroundDrawable.hashCode() : 0);
result = 31 * result + myLocationForegroundTintColor;
result = 31 * result + myLocationBackgroundTintColor;
result = 31 * result + Arrays.hashCode(myLocationBackgroundPadding);
result = 31 * result + myLocationAccuracyTintColor;
result = 31 * result + myLocationAccuracyAlpha;
result = 31 * result + (style != null ? style.hashCode() : 0);
result = 31 * result + (accessToken != null ? accessToken.hashCode() : 0);
return result;
}
}

View File

@@ -5,7 +5,7 @@ import android.support.annotation.UiThread;
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
import com.mapbox.mapboxsdk.maps.widgets.UserLocationView;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationView;
/**
* Settings for the user location and bearing tracking of a MapboxMap.
@@ -67,7 +67,7 @@ public class TrackingSettings {
* </p>
* Shows the direction the user is heading.
* <p>
* When location tracking is disabled the direction of {@link UserLocationView} is rotated
* When location tracking is disabled the direction of {@link MyLocationView} is rotated
* When location tracking is enabled the {@link MapView} is rotated based on bearing value.
* </p>
* See {@link MyBearingTracking} for different values.

View File

@@ -15,7 +15,6 @@ public class UiSettings {
private MapView mapView;
private MyLocationViewSettings myLocationViewSettings;
private ViewSettings compassSettings;
private ViewSettings logoSettings;
private ViewSettings attributionSettings;
@@ -568,22 +567,4 @@ public class UiSettings {
mapView.setCompassMargins(getCompassMarginLeft(), getCompassMarginTop(), getCompassMarginRight(), getCompassMarginBottom());
mapView.setAttributionMargins(getAttributionMarginLeft(), getAttributionMarginTop(), getAttributionMarginRight(), getAttributionMarginBottom());
}
/**
* Returns the view settings related to the My Location View
*
* @return viewSettings used for My Location view.
*/
public MyLocationViewSettings getMyLocationViewSettings() {
return myLocationViewSettings;
}
/**
* Replaces the currenlty used view settings related to the My Location View.
*
* @param myLocationViewSettings The settings to be used.
*/
public void setMyLocationViewSettings(MyLocationViewSettings myLocationViewSettings) {
this.myLocationViewSettings = myLocationViewSettings;
}
}

View File

@@ -3,7 +3,6 @@ package com.mapbox.mapboxsdk.maps.widgets;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.PorterDuff;
@@ -29,6 +28,7 @@ import android.view.View;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
import com.mapbox.mapboxsdk.geometry.LatLng;
@@ -44,9 +44,9 @@ import java.lang.ref.WeakReference;
/**
* UI element overlaid on a map to show the user's location.
*/
public class UserLocationView extends View {
public class MyLocationView extends View {
private UserLocationBehaviour userLocationBehaviour;
private MyLocationBehaviour myLocationBehaviour;
private MapboxMap mapboxMap;
private Projection projection;
private int maxSize;
@@ -89,17 +89,17 @@ public class UserLocationView extends View {
private GpsLocationListener userLocationListener;
private CompassListener compassListener;
public UserLocationView(Context context) {
public MyLocationView(Context context) {
super(context);
init(context);
}
public UserLocationView(Context context, AttributeSet attrs) {
public MyLocationView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public UserLocationView(Context context, AttributeSet attrs, int defStyleAttr) {
public MyLocationView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
@@ -108,22 +108,22 @@ public class UserLocationView extends View {
setEnabled(false);
// behavioural model
userLocationBehaviour = new UserLocationBehaviourFactory().getBehaviouralModel(MyLocationTracking.TRACKING_NONE);
myLocationBehaviour = new MyLocationBehaviourFactory().getBehaviouralModel(MyLocationTracking.TRACKING_NONE);
compassListener = new CompassListener(context);
maxSize = (int) context.getResources().getDimension(R.dimen.userlocationview_size);
// default implementation
setShadowDrawable(ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_shadow));
setShadowDrawableTint(ColorUtils.getPrimaryDarkColor(context));
setForegroundDrawables(ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_normal), ContextCompat.getDrawable(context, R.drawable.ic_userlocationview_bearing));
setForegroundDrawableTint(ColorUtils.getPrimaryColor(context));
accuracyPaint.setColor(ColorUtils.getAccentColor(context));
accuracyPaint.setAlpha(100);
setAccuracyTint(ColorUtils.getAccentColor(context));
setAccuracyAlpha(100);
}
public final void setForegroundDrawables(Drawable defaultDrawable, Drawable bearingDrawable) {
if (defaultDrawable == null || bearingDrawable == null) {
Log.e(MapboxConstants.TAG, "Not setting foreground drawables MyLocationView: default = " + defaultDrawable + " bearing = " + bearingDrawable);
return;
}
if (defaultDrawable.getIntrinsicWidth() != bearingDrawable.getIntrinsicWidth() || defaultDrawable.getIntrinsicHeight() != bearingDrawable.getIntrinsicHeight()) {
throw new RuntimeException("The dimensions from location and bearing drawables should be match");
}
@@ -146,6 +146,9 @@ public class UserLocationView extends View {
}
public final void setShadowDrawable(Drawable drawable, int left, int top, int right, int bottom) {
if (drawable == null) {
return;
}
backgroundDrawable = drawable;
backgroundOffsetLeft = left;
backgroundOffsetTop = top;
@@ -163,7 +166,9 @@ public class UserLocationView extends View {
}
public final void setAccuracyTint(@ColorInt int color) {
int alpha = accuracyPaint.getAlpha();
accuracyPaint.setColor(color);
accuracyPaint.setAlpha(alpha);
}
public final void setAccuracyAlpha(@IntRange(from = 0, to = 255) int alpha) {
@@ -278,7 +283,7 @@ public class UserLocationView extends View {
public void update() {
if (isEnabled()) {
userLocationBehaviour.invalidate();
myLocationBehaviour.invalidate();
} else {
setVisibility(View.INVISIBLE);
}
@@ -336,7 +341,7 @@ public class UserLocationView extends View {
}
this.location = location;
userLocationBehaviour.updateLatLng(location);
myLocationBehaviour.updateLatLng(location);
}
public void setMyBearingTrackingMode(@MyBearingTracking.Mode int myBearingTrackingMode) {
@@ -357,12 +362,12 @@ public class UserLocationView extends View {
public void setMyLocationTrackingMode(@MyLocationTracking.Mode int myLocationTrackingMode) {
this.myLocationTrackingMode = myLocationTrackingMode;
UserLocationBehaviourFactory factory = new UserLocationBehaviourFactory();
userLocationBehaviour = factory.getBehaviouralModel(myLocationTrackingMode);
MyLocationBehaviourFactory factory = new MyLocationBehaviourFactory();
myLocationBehaviour = factory.getBehaviouralModel(myLocationTrackingMode);
if (myLocationTrackingMode != MyLocationTracking.TRACKING_NONE && location != null) {
// center map directly if we have a location fix
userLocationBehaviour.updateLatLng(location);
myLocationBehaviour.updateLatLng(location);
mapboxMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(location)));
}
invalidate();
@@ -400,10 +405,10 @@ public class UserLocationView extends View {
private static class GpsLocationListener implements LocationListener {
private WeakReference<UserLocationView> mUserLocationView;
private WeakReference<MyLocationView> mUserLocationView;
public GpsLocationListener(UserLocationView userLocationView) {
mUserLocationView = new WeakReference<>(userLocationView);
public GpsLocationListener(MyLocationView myLocationView) {
mUserLocationView = new WeakReference<>(myLocationView);
}
/**
@@ -413,7 +418,7 @@ public class UserLocationView extends View {
*/
@Override
public void onLocationChanged(Location location) {
UserLocationView locationView = mUserLocationView.get();
MyLocationView locationView = mUserLocationView.get();
if (locationView != null) {
locationView.setLocation(location);
}
@@ -511,14 +516,14 @@ public class UserLocationView extends View {
private class MarkerCoordinateAnimatorListener implements ValueAnimator.AnimatorUpdateListener {
private UserLocationBehaviour behaviour;
private MyLocationBehaviour behaviour;
private double fromLat;
private double fromLng;
private double toLat;
private double toLng;
private MarkerCoordinateAnimatorListener(UserLocationBehaviour userLocationBehaviour, LatLng from, LatLng to) {
behaviour = userLocationBehaviour;
private MarkerCoordinateAnimatorListener(MyLocationBehaviour myLocationBehaviour, LatLng from, LatLng to) {
behaviour = myLocationBehaviour;
fromLat = from.getLatitude();
fromLng = from.getLongitude();
toLat = to.getLatitude();
@@ -535,18 +540,18 @@ public class UserLocationView extends View {
}
}
private class UserLocationBehaviourFactory {
private class MyLocationBehaviourFactory {
public UserLocationBehaviour getBehaviouralModel(@MyLocationTracking.Mode int mode) {
public MyLocationBehaviour getBehaviouralModel(@MyLocationTracking.Mode int mode) {
if (mode == MyLocationTracking.TRACKING_NONE) {
return new UserLocationShowBehaviour();
return new MyLocationShowBehaviour();
} else {
return new UserLocationTrackingBehaviour();
return new MyLocationTrackingBehaviour();
}
}
}
private abstract class UserLocationBehaviour {
private abstract class MyLocationBehaviour {
abstract void updateLatLng(@NonNull Location location);
@@ -564,7 +569,7 @@ public class UserLocationView extends View {
accuracyAnimator.end();
}
accuracyAnimator = ValueAnimator.ofFloat(accuracy, location.getAccuracy());
accuracyAnimator = ValueAnimator.ofFloat(accuracy * 10, location.getAccuracy() * 10);
accuracyAnimator.setDuration(750);
accuracyAnimator.start();
accuracy = location.getAccuracy();
@@ -573,7 +578,7 @@ public class UserLocationView extends View {
abstract void invalidate();
}
private class UserLocationTrackingBehaviour extends UserLocationBehaviour {
private class MyLocationTrackingBehaviour extends MyLocationBehaviour {
@Override
void updateLatLng(@NonNull Location location) {
@@ -581,7 +586,6 @@ public class UserLocationView extends View {
// first location fix
latLng = new LatLng(location);
locationUpdateTimestamp = SystemClock.elapsedRealtime();
return;
}
// updateLatLng timestamp
@@ -630,19 +634,18 @@ 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();
MyLocationView.this.invalidate();
}
}
private class UserLocationShowBehaviour extends UserLocationBehaviour {
private class MyLocationShowBehaviour extends MyLocationBehaviour {
@Override
void updateLatLng(@NonNull final Location location) {
if (latLng == null) {
// first location updateLatLng
// first location update
latLng = new LatLng(location);
locationUpdateTimestamp = SystemClock.elapsedRealtime();
return;
}
// update LatLng location
@@ -701,7 +704,7 @@ public class UserLocationView extends View {
setX((screenLocation.x - getWidth() / 2));
setY((screenLocation.y - getHeight() / 2));
}
UserLocationView.this.invalidate();
MyLocationView.this.invalidate();
}
}
}

View File

@@ -4,13 +4,12 @@ import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.annotation.IntRange;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.maps.MapView;
public class MyLocationViewSettings {
private MapView mapView;
private UserLocationView userLocationView;
private MyLocationView myLocationView;
//
// State
@@ -42,7 +41,7 @@ public class MyLocationViewSettings {
// Accuracy
//
private int arruracyAlpha;
private int accuracyAlpha;
@ColorInt
private int accuracyTintColor;
@@ -53,9 +52,9 @@ public class MyLocationViewSettings {
private int[] padding = new int[4];
public MyLocationViewSettings(MapView mapView, UserLocationView userLocationView) {
public MyLocationViewSettings(MapView mapView, MyLocationView myLocationView) {
this.mapView = mapView;
this.userLocationView = userLocationView;
this.myLocationView = myLocationView;
}
public boolean isEnabled() {
@@ -64,13 +63,13 @@ public class MyLocationViewSettings {
public void setEnabled(boolean enabled) {
this.enabled = enabled;
userLocationView.setEnabled(enabled);
myLocationView.setEnabled(enabled);
}
public void setForegroundDrawable(Drawable foregroundDrawable, Drawable foregroundBearingDrawable) {
this.foregroundDrawable = foregroundDrawable;
this.foregroundBearingDrawable = foregroundBearingDrawable;
userLocationView.setForegroundDrawables(foregroundDrawable, foregroundBearingDrawable);
myLocationView.setForegroundDrawables(foregroundDrawable, foregroundBearingDrawable);
}
public Drawable getForegroundDrawable() {
@@ -83,7 +82,7 @@ public class MyLocationViewSettings {
public void setForegroundTintColor(@ColorInt int foregroundTintColor) {
this.foregroundTintColor = foregroundTintColor;
userLocationView.setForegroundDrawableTint(foregroundTintColor);
myLocationView.setForegroundDrawableTint(foregroundTintColor);
}
public int getForegroundTintColor() {
@@ -92,7 +91,7 @@ public class MyLocationViewSettings {
public void setBackgroundDrawable(Drawable backgroundDrawable) {
this.backgroundDrawable = backgroundDrawable;
userLocationView.setShadowDrawable(backgroundDrawable);
myLocationView.setShadowDrawable(backgroundDrawable);
}
public Drawable getBackgroundDrawable() {
@@ -101,7 +100,7 @@ public class MyLocationViewSettings {
public void setBackgroundTintColor(@ColorInt int backgroundTintColor) {
this.backgroundTintColor = backgroundTintColor;
userLocationView.setShadowDrawableTint(backgroundTintColor);
myLocationView.setShadowDrawableTint(backgroundTintColor);
}
public int getBackgroundTintColor() {
@@ -110,7 +109,7 @@ public class MyLocationViewSettings {
public void setBackgroundOffset(int left, int top, int right, int bottom) {
backgroundOffset = new int[]{left, top, right, bottom};
userLocationView.setShadowDrawable(backgroundDrawable, left, top, right, bottom);
myLocationView.setShadowDrawable(backgroundDrawable, left, top, right, bottom);
}
public int[] getBackgroundOffset() {
@@ -119,7 +118,7 @@ public class MyLocationViewSettings {
public void setPadding(int left, int top, int right, int bottom) {
padding = new int[]{left, top, right, bottom};
userLocationView.setContentPadding(padding);
myLocationView.setContentPadding(padding);
mapView.invalidateContentPadding();
}
@@ -128,12 +127,12 @@ public class MyLocationViewSettings {
}
public int getAccuracyAlpha() {
return arruracyAlpha;
return accuracyAlpha;
}
public void setAccuracyAlpha(@IntRange(from = 0, to = 255) int arruracyAlpha) {
this.arruracyAlpha = arruracyAlpha;
userLocationView.setAccuracyAlpha(arruracyAlpha);
this.accuracyAlpha = arruracyAlpha;
myLocationView.setAccuracyAlpha(arruracyAlpha);
}
public int getAccuracyTintColor() {
@@ -142,7 +141,6 @@ public class MyLocationViewSettings {
public void setAccuracyTintColor(@ColorInt int accuracyTintColor) {
this.accuracyTintColor = accuracyTintColor;
userLocationView.setAccuracyTint(accuracyTintColor);
myLocationView.setAccuracyTint(accuracyTintColor);
}
}

View File

@@ -1,60 +0,0 @@
package com.mapbox.mapboxsdk.maps.widgets;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
/**
* <p>Holder for the UserLocationView drawables.</p>
* <p>Holds the drawable and its shadow if set, and manage their initialization.</p>
*/
class UserLocationViewDrawableHolder {
Drawable mDrawable;
Drawable mShadow;
final RectF mBounds = new RectF();
final RectF mShadowBounds = new RectF();
public UserLocationViewDrawableHolder() {
}
public UserLocationViewDrawableHolder(Drawable drawable, Drawable shadow) {
setDrawable(drawable);
setShadow(shadow);
}
void setDrawable(@NonNull Drawable drawable) {
mDrawable = drawable;
setDrawable(mDrawable, mBounds);
}
void setShadow(@Nullable Drawable drawable) {
mShadow = drawable;
setDrawable(mShadow, mShadowBounds);
}
boolean hasShadow() {
return mShadow != null;
}
private static void setDrawable(final @Nullable Drawable drawable, final @NonNull RectF bounds) {
if (drawable != null) {
int halfWidth = drawable.getIntrinsicWidth() / 2;
int halfHeight = drawable.getIntrinsicHeight() / 2;
bounds.set(
-halfWidth,
-halfHeight,
halfWidth,
halfHeight);
drawable.setBounds(new Rect(
-halfWidth,
-halfHeight,
halfWidth,
halfHeight));
} else {
bounds.setEmpty();
}
}
}