diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java index bf4d23656..0736870aa 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java @@ -658,7 +658,7 @@ public final class MapView extends FrameLayout { // Setup Mapbox logo mLogoView = new ImageView(mContext); - mLogoView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_logo_mapbox)); + mLogoView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.attribution_logo)); mLogoView.setContentDescription(getResources().getString(R.string.mapboxIconContentDescription)); ViewGroup.LayoutParams logoParams = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java index 8ac065f60..7453f4e28 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java @@ -12,12 +12,15 @@ import android.graphics.Path; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; +import android.graphics.drawable.Drawable; import android.location.Location; import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; +import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapzen.android.lost.api.LocationListener; import com.mapzen.android.lost.api.LocationRequest; @@ -30,32 +33,37 @@ final class UserLocationView extends View { private WeakReference mMapView; + private static final int BLUE_COLOR = 0x39ACCBFF; + private float mDensity; + + private boolean mShowMarker; + private boolean mShowDirection; + private boolean mShowAccuracy; + private PointF mMarkerScreenPoint; private Matrix mMarkerScreenMatrix; - private Paint mOuterRingPaint; - private Path mOuterRingPath; - private RectF mOuterRingBounds; - - private Paint mInnerRingPaintFill; - private Paint mInnerRingPaintStroke; - private Path mInnerRingPath; - - private boolean mShowDirection; - private Paint mDirectionArrowPaint; - private Path mDirectionArrowPath; - - private boolean mShowAccuracy; private Paint mAccuracyPaintFill; private Paint mAccuracyPaintStroke; private Path mAccuracyPath; private RectF mAccuracyBounds; + private Drawable mUserLocationDrawable; + private RectF mUserLocationDrawableBoundsF; + private Rect mUserLocationDrawableBounds; + + private Drawable mUserLocationBearingDrawable; + private RectF mUserLocationBearingDrawableBoundsF; + private Rect mUserLocationBearingDrawableBounds; + + private Drawable mUserLocationStaleDrawable; + private RectF mUserLocationStaleDrawableBoundsF; + private Rect mUserLocationStaleDrawableBounds; + private Rect mDirtyRect; private RectF mDirtyRectF; - private boolean mShowMarker; private LatLng mMarkerCoordinate; private ValueAnimator mMarkerCoordinateAnimator; private float mMarkerDirection; @@ -91,6 +99,7 @@ final class UserLocationView extends View { // View configuration setEnabled(false); + setWillNotDraw(false); // Layout params ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams( @@ -112,58 +121,60 @@ final class UserLocationView extends View { mMarkerScreenPoint = new PointF(); mMarkerScreenMatrix = new Matrix(); - mOuterRingPaint = new Paint(); - mOuterRingPaint.setAntiAlias(true); - mOuterRingPaint.setStyle(Paint.Style.FILL); - mOuterRingPaint.setColor(Color.BLACK); - mOuterRingPaint.setAlpha((int) (255 * 0.5f)); - - mOuterRingPath = new Path(); - mOuterRingPath.addCircle(0.0f, 0.0f, 15.0f * mDensity, Path.Direction.CW); - - mOuterRingBounds = new RectF(); - mOuterRingPath.computeBounds(mOuterRingBounds, false); - - mInnerRingPaintFill = new Paint(); - mInnerRingPaintFill.setAntiAlias(true); - mInnerRingPaintFill.setStyle(Paint.Style.FILL); - mInnerRingPaintFill.setColor(Color.WHITE); - - mInnerRingPaintStroke = new Paint(); - mInnerRingPaintStroke.setAntiAlias(true); - mInnerRingPaintStroke.setStyle(Paint.Style.STROKE); - mInnerRingPaintStroke.setStrokeWidth(1.0f * mDensity); - mInnerRingPaintStroke.setColor(Color.BLACK); - - mInnerRingPath = new Path(); - mInnerRingPath.addCircle(0.0f, 0.0f, 7.5f * mDensity, Path.Direction.CW); - - mDirectionArrowPaint = mInnerRingPaintFill; - - mDirectionArrowPath = new Path(); - mDirectionArrowPath.moveTo(0.0f, -15.0f * mDensity); - mDirectionArrowPath.arcTo( - new RectF( - -9.0f * mDensity, -9.0f * mDensity, - 9.0f * mDensity, 9.0f * mDensity), - 225.0f, 90.0f, false); - mDirectionArrowPath.close(); - mAccuracyPaintFill = new Paint(); mAccuracyPaintFill.setAntiAlias(true); mAccuracyPaintFill.setStyle(Paint.Style.FILL); - mAccuracyPaintFill.setColor(Color.BLACK); + mAccuracyPaintFill.setColor(BLUE_COLOR); mAccuracyPaintFill.setAlpha((int) (255 * 0.25f)); mAccuracyPaintStroke = new Paint(); mAccuracyPaintStroke.setAntiAlias(true); mAccuracyPaintStroke.setStyle(Paint.Style.STROKE); mAccuracyPaintStroke.setStrokeWidth(0.5f * mDensity); - mAccuracyPaintStroke.setColor(Color.BLACK); + mAccuracyPaintStroke.setColor(BLUE_COLOR); mAccuracyPaintStroke.setAlpha((int) (255 * 0.5f)); mAccuracyPath = new Path(); mAccuracyBounds = new RectF(); + + mUserLocationDrawable = ContextCompat.getDrawable(getContext(), R.drawable.user_location); + mUserLocationDrawableBounds = new Rect( + -mUserLocationDrawable.getIntrinsicWidth() / 2, + -mUserLocationDrawable.getIntrinsicHeight() / 2, + mUserLocationDrawable.getIntrinsicWidth() / 2, + mUserLocationDrawable.getIntrinsicHeight() / 2); + mUserLocationDrawableBoundsF = new RectF( + -mUserLocationDrawable.getIntrinsicWidth() / 2, + -mUserLocationDrawable.getIntrinsicHeight() / 2, + mUserLocationDrawable.getIntrinsicWidth() / 2, + mUserLocationDrawable.getIntrinsicHeight() / 2); + mUserLocationDrawable.setBounds(mUserLocationDrawableBounds); + + mUserLocationBearingDrawable = ContextCompat.getDrawable(getContext(), R.drawable.user_location_bearing); + mUserLocationBearingDrawableBounds = new Rect( + -mUserLocationBearingDrawable.getIntrinsicWidth() / 2, + -mUserLocationBearingDrawable.getIntrinsicHeight() / 2, + mUserLocationBearingDrawable.getIntrinsicWidth() / 2, + mUserLocationBearingDrawable.getIntrinsicHeight() / 2); + mUserLocationBearingDrawableBoundsF = new RectF( + -mUserLocationBearingDrawable.getIntrinsicWidth() / 2, + -mUserLocationBearingDrawable.getIntrinsicHeight() / 2, + mUserLocationBearingDrawable.getIntrinsicWidth() / 2, + mUserLocationBearingDrawable.getIntrinsicHeight() / 2); + mUserLocationBearingDrawable.setBounds(mUserLocationBearingDrawableBounds); + + mUserLocationStaleDrawable = ContextCompat.getDrawable(getContext(), R.drawable.user_location_stale); + mUserLocationStaleDrawableBounds = new Rect( + -mUserLocationStaleDrawable.getIntrinsicWidth() / 2, + -mUserLocationStaleDrawable.getIntrinsicHeight() / 2, + mUserLocationStaleDrawable.getIntrinsicWidth() / 2, + mUserLocationStaleDrawable.getIntrinsicHeight() / 2); + mUserLocationStaleDrawableBoundsF = new RectF( + -mUserLocationStaleDrawable.getIntrinsicWidth() / 2, + -mUserLocationStaleDrawable.getIntrinsicHeight() / 2, + mUserLocationStaleDrawable.getIntrinsicWidth() / 2, + mUserLocationStaleDrawable.getIntrinsicHeight() / 2); + mUserLocationStaleDrawable.setBounds(mUserLocationStaleDrawableBounds); } @Override @@ -176,17 +187,24 @@ final class UserLocationView extends View { canvas.concat(mMarkerScreenMatrix); - if (!canvas.quickReject(mOuterRingPath, Canvas.EdgeType.AA)) { + Drawable dotDrawable = mShowDirection ? mUserLocationBearingDrawable : mUserLocationDrawable; + // IMPORTANT also update in uodate() + RectF dotBounds = mShowDirection ? mUserLocationBearingDrawableBoundsF : mUserLocationDrawableBoundsF; + + boolean willDraw; + willDraw = mShowAccuracy && !canvas.quickReject(mAccuracyPath, Canvas.EdgeType.AA); + willDraw |= !canvas.quickReject(dotBounds, Canvas.EdgeType.AA); + + dotBounds.offset( + (int) -mMarkerScreenPoint.x, + (int) -mMarkerScreenPoint.y); + + if (willDraw) { if (mShowAccuracy) { canvas.drawPath(mAccuracyPath, mAccuracyPaintFill); canvas.drawPath(mAccuracyPath, mAccuracyPaintStroke); } - canvas.drawPath(mOuterRingPath, mOuterRingPaint); - canvas.drawPath(mInnerRingPath, mInnerRingPaintFill); - canvas.drawPath(mInnerRingPath, mInnerRingPaintStroke); - if (mShowDirection) { - canvas.drawPath(mDirectionArrowPath, mDirectionArrowPaint); - } + dotDrawable.draw(canvas); } } @@ -224,6 +242,7 @@ final class UserLocationView extends View { Path.Direction.CW); mAccuracyPath.computeBounds(mAccuracyBounds, false); + mAccuracyBounds.inset(-1.0f, -1.0f); } // invalidate changed pixels @@ -232,22 +251,14 @@ final class UserLocationView extends View { mDirtyRectF = new RectF(); } else { // the old marker location - // TODO need to take into account accuracy stroke - //invalidate(mDirtyRect); - invalidate(); + invalidate(mDirtyRect); } - RectF largerBounds; - if (mAccuracyBounds.contains(mOuterRingBounds)) { - largerBounds = mAccuracyBounds; - } else { - largerBounds = mOuterRingBounds; - } + RectF dotBounds = mShowDirection ? mUserLocationBearingDrawableBoundsF : mUserLocationDrawableBoundsF; + RectF largerBounds = mAccuracyBounds.contains(dotBounds) ? mAccuracyBounds : dotBounds; mMarkerScreenMatrix.mapRect(mDirtyRectF, largerBounds); mDirtyRectF.roundOut(mDirtyRect); - // TODO need to take into account accuracy stroke - //invalidate(mDirtyRect); // the new marker location - invalidate(); + invalidate(mDirtyRect); // the new marker location } else { setVisibility(View.INVISIBLE); } diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/attribution_logo.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/attribution_logo.png new file mode 100644 index 000000000..c0f4ed2c4 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/attribution_logo.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location.png new file mode 100755 index 000000000..1ae8d541a Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location_bearing.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location_bearing.png new file mode 100755 index 000000000..8ecaffa2e Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location_bearing.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location_stale.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location_stale.png new file mode 100755 index 000000000..0d599c01f Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/user_location_stale.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/attribution_logo.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/attribution_logo.png new file mode 100644 index 000000000..5a9da3fe3 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/attribution_logo.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location.png new file mode 100755 index 000000000..542cd25e2 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location_bearing.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location_bearing.png new file mode 100755 index 000000000..429f03f64 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location_bearing.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location_stale.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location_stale.png new file mode 100755 index 000000000..6613c4115 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/user_location_stale.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/attribution_logo.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/attribution_logo.png new file mode 100644 index 000000000..194aa64da Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/attribution_logo.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location.png new file mode 100755 index 000000000..ca1f1fe63 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location_bearing.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location_bearing.png new file mode 100755 index 000000000..1b88f9f48 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location_bearing.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location_stale.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location_stale.png new file mode 100755 index 000000000..7af3789ff Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/user_location_stale.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_logo_mapbox.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/attribution_logo.png similarity index 100% rename from android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_logo_mapbox.png rename to android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/attribution_logo.png diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location.png new file mode 100755 index 000000000..6f175df16 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location_bearing.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location_bearing.png new file mode 100755 index 000000000..f4bb454a0 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location_bearing.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location_stale.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location_stale.png new file mode 100755 index 000000000..f1d2f2eca Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/user_location_stale.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/attribution_logo.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/attribution_logo.png new file mode 100644 index 000000000..5f9647610 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/attribution_logo.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/compass.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/compass.png new file mode 100755 index 000000000..da04f5b94 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/compass.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location.png new file mode 100755 index 000000000..d43541ac3 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location_bearing.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location_bearing.png new file mode 100755 index 000000000..a8cccbb3e Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location_bearing.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location_stale.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location_stale.png new file mode 100755 index 000000000..33e952391 Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/user_location_stale.png differ diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml index 2786ea7b9..0de0715be 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ Map compass. Click to reset the map rotation to North. Attribution icon. Click to show attribution dialog. Mapbox Android SDK - Mapbox logo. + The Mapbox logo. Title Description Address diff --git a/platform/android/resources/compass.svg b/platform/android/resources/compass.svg new file mode 100755 index 000000000..fd27e73f2 --- /dev/null +++ b/platform/android/resources/compass.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/android/resources/direction-dot.svg b/platform/android/resources/direction-dot.svg new file mode 100755 index 000000000..14ce0bf7f --- /dev/null +++ b/platform/android/resources/direction-dot.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/platform/android/resources/location-dot.svg b/platform/android/resources/location-dot.svg new file mode 100755 index 000000000..24addea3c --- /dev/null +++ b/platform/android/resources/location-dot.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/platform/android/resources/location-static-dot.svg b/platform/android/resources/location-static-dot.svg new file mode 100755 index 000000000..18269bcdf --- /dev/null +++ b/platform/android/resources/location-static-dot.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/platform/default/resources/attribution-logo.svg b/platform/default/resources/attribution-logo.svg new file mode 100644 index 000000000..f6edd35cd --- /dev/null +++ b/platform/default/resources/attribution-logo.svg @@ -0,0 +1 @@ +image/svg+xml \ No newline at end of file