From 75dbbcdcc03a7a4c613b2e49e07d4c975eef0f1b Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Wed, 25 May 2016 11:59:21 +0200 Subject: [PATCH] [android] #5079 - add anchor and InfoWindowAnchor to MarkerView --- .../annotations/BaseMarkerViewOptions.java | 38 ++++++---- .../mapboxsdk/annotations/InfoWindow.java | 5 +- .../mapboxsdk/annotations/MarkerView.java | 70 ++++++++++++++----- .../annotations/MarkerViewManager.java | 20 +++--- .../annotations/MarkerViewOptions.java | 16 ++--- .../annotation/MarkerViewActivity.java | 1 - .../annotations/CountryMarkerViewOptions.java | 49 ++++--------- 7 files changed, 111 insertions(+), 88 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java index 18db87f2c..892eee180 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java @@ -1,7 +1,5 @@ package com.mapbox.mapboxsdk.annotations; -import android.graphics.Point; -import android.graphics.PointF; import android.os.Parcelable; import android.support.annotation.AnimatorRes; import android.support.annotation.NonNull; @@ -23,16 +21,16 @@ public abstract class BaseMarkerViewOptions mView; private float mMarkerHeightOffset; + private float mMarkerWidthOffset; private float mViewWidthOffset; private PointF mCoordinates; private boolean mIsVisible; @@ -108,9 +109,9 @@ public class InfoWindow { // Calculate y-offset for update method mMarkerHeightOffset = -view.getMeasuredHeight() + offsetY; + mMarkerWidthOffset = -offsetX; // Calculate default Android x,y coordinate - mCoordinates = mapboxMap.getProjection().toScreenLocation(position); float x = mCoordinates.x - (view.getMeasuredWidth() / 2) + offsetX; float y = mCoordinates.y - view.getMeasuredHeight() + offsetY; @@ -244,7 +245,7 @@ public class InfoWindow { View view = mView.get(); if (mapboxMap != null && marker != null && view != null) { mCoordinates = mapboxMap.getProjection().toScreenLocation(marker.getPosition()); - view.setX(mCoordinates.x + mViewWidthOffset); + view.setX(mCoordinates.x + mViewWidthOffset - mMarkerWidthOffset); view.setY(mCoordinates.y + mMarkerHeightOffset); } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java index 270b43d45..870480b54 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java @@ -1,18 +1,22 @@ package com.mapbox.mapboxsdk.annotations; -import android.graphics.Point; -import android.graphics.PointF; - import com.mapbox.mapboxsdk.maps.MapboxMap; public class MarkerView extends Marker { private MarkerViewManager markerViewManager; - private PointF centerOffset; - private Point infoWindowOffset; + private float anchorU; + private float anchorV; + + private float offsetX; + private float offsetY; + + private float infoWindowAnchorU; + private float infoWindowAnchorV; + private boolean flat; - private boolean visible; + private boolean visible = true; private int selectAnimRes; private int deselectAnimRes; @@ -22,33 +26,63 @@ public class MarkerView extends Marker { private float alpha = 1; MarkerView() { - centerOffset = new PointF(); - infoWindowOffset = new Point(); } public MarkerView(BaseMarkerViewOptions baseMarkerViewOptions) { super(baseMarkerViewOptions); - this.centerOffset = baseMarkerViewOptions.getCenterOffset(); - this.infoWindowOffset = baseMarkerViewOptions.getInfoWindowOffset(); + this.anchorU = baseMarkerViewOptions.getAnchorU(); + this.anchorV = baseMarkerViewOptions.getAnchorV(); + this.infoWindowAnchorU = baseMarkerViewOptions.getInfoWindowAnchorU(); + this.infoWindowAnchorV = baseMarkerViewOptions.getInfoWindowAnchorV(); this.flat = baseMarkerViewOptions.isFlat(); this.selectAnimRes = baseMarkerViewOptions.getSelectAnimRes(); this.deselectAnimRes = baseMarkerViewOptions.getDeselectAnimRes(); + this.infoWindowAnchorU = baseMarkerViewOptions.infoWindowAnchorU; + this.infoWindowAnchorV = baseMarkerViewOptions.infoWindowAnchorV; + this.anchorU = baseMarkerViewOptions.anchorU; + this.anchorV = baseMarkerViewOptions.anchorV; } - public PointF getCenterOffset() { - return centerOffset; + public void setAnchor(float u, float v) { + this.anchorU = u; + this.anchorV = v; } - public void setCenterOffset(PointF centerOffset) { - this.centerOffset = centerOffset; + public float getAnchorU() { + return anchorU; } - public Point getInfoWindowOffset() { - return infoWindowOffset; + public float getAnchorV() { + return anchorV; } - public void setInfoWindowOffset(Point infoWindowOffset) { - this.infoWindowOffset = infoWindowOffset; + void setOffsetX(float x){ + offsetX = x; + } + + void setOffsetY(float y){ + offsetY = y; + } + + float getOffsetX() { + return offsetX; + } + + float getOffsetY() { + return offsetY; + } + + public void setInfoWindowAnchor(float u, float v) { + this.infoWindowAnchorU = u; + this.infoWindowAnchorV = v; + } + + public float getInfoWindowAnchorU() { + return infoWindowAnchorU; + } + + public float getInfoWindowAnchorV() { + return infoWindowAnchorV; } public boolean isFlat() { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java index c0c18e59e..fcb7894d1 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java @@ -1,6 +1,5 @@ package com.mapbox.mapboxsdk.annotations; -import android.graphics.Point; import android.graphics.PointF; import android.os.SystemClock; import android.support.annotation.NonNull; @@ -62,8 +61,13 @@ public class MarkerViewManager { convertView = mMarkerViewMap.get(marker); if (convertView != null) { PointF point = mapboxMap.getProjection().toScreenLocation(marker.getPosition()); - convertView.setX(point.x - (convertView.getMeasuredWidth() / 2)); - convertView.setY(point.y - (convertView.getMeasuredHeight() / 2)); + int x = (int) (marker.getAnchorU() * convertView.getMeasuredWidth()); + int y = (int) (marker.getAnchorV() * convertView.getMeasuredHeight()); + marker.setOffsetX(x); + marker.setOffsetY(y); + convertView.setX(point.x - x); + convertView.setY(point.y - y); + if (marker.isVisible() && convertView.getVisibility() == View.GONE) { convertView.animate().cancel(); convertView.setAlpha(0); @@ -176,7 +180,7 @@ public class MarkerViewManager { for (final MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { if (adapter.getMarkerClass() == marker.getClass()) { convertView = (View) adapter.getViewReusePool().acquire(); - View adaptedView = adapter.getView(marker, convertView, mapView); + final View adaptedView = adapter.getView(marker, convertView, mapView); if (adaptedView != null) { // tilt @@ -210,11 +214,11 @@ public class MarkerViewManager { } if (!clickHandled) { - // InfoWindow offset - Point infoWindowOffset = marker.getInfoWindowOffset(); - marker.setTopOffsetPixels(-(v.getHeight() / 2) - infoWindowOffset.y); - marker.setRightOffsetPixels(infoWindowOffset.x); + int infoWindowOffsetX = (int) ((adaptedView.getWidth() * marker.getInfoWindowAnchorU()) - marker.getOffsetX()); + int infoWindowOffsetY = (int) ((adaptedView.getHeight() * marker.getInfoWindowAnchorV()) -marker.getOffsetY()); + marker.setTopOffsetPixels(infoWindowOffsetY); + marker.setRightOffsetPixels(infoWindowOffsetX); if (animSelectRes != 0) { AnimatorUtils.animate(v, animSelectRes, new AnimatorUtils.OnAnimationEndListener() { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewOptions.java index 29435a9d9..a688a8b1a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewOptions.java @@ -1,8 +1,6 @@ package com.mapbox.mapboxsdk.annotations; import android.graphics.Bitmap; -import android.graphics.Point; -import android.graphics.PointF; import android.os.Parcel; import android.os.Parcelable; @@ -22,8 +20,8 @@ public class MarkerViewOptions extends BaseMarkerViewOptions { @@ -24,10 +25,11 @@ public class CountryMarkerViewOptions extends BaseMarkerViewOptions CREATOR = new Parcelable.Creator() { public CountryMarkerViewOptions createFromParcel(Parcel in) {