From 952875a30c104b779f3563a27b4caf1a7b674662 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Fri, 20 May 2016 08:05:05 +0200 Subject: [android] #3276 - View Marker model integration --- .../mapboxsdk/annotations/BaseMarkerOptions.java | 9 -- .../annotations/BaseMarkerViewOptions.java | 119 +++++++++++++++++ .../com/mapbox/mapboxsdk/annotations/Marker.java | 18 +-- .../mapboxsdk/annotations/MarkerOptions.java | 35 +++-- .../mapbox/mapboxsdk/annotations/MarkerView.java | 78 +++++++++++ .../mapboxsdk/annotations/MarkerViewOptions.java | 142 +++++++++++++++++++++ .../mapboxsdk/annotations/MarkerViewSettings.java | 105 --------------- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 30 ++++- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 99 +++++++------- .../activity/annotation/BulkMarkerActivity.java | 26 ++-- .../annotation/ViewMarkerAdapterActivity.java | 71 +++++------ .../model/annotations/CountryMarkerView.java | 24 ++++ .../annotations/CountryMarkerViewOptions.java | 127 ++++++++++++++++++ 13 files changed, 644 insertions(+), 239 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewOptions.java delete mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerView.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerViewOptions.java (limited to 'platform') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java index 27bf8345e7..fc2022f9e1 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerOptions.java @@ -18,7 +18,6 @@ public abstract class BaseMarkerOptions Type of the marker to be composed + * @param Type of the builder to be used for composing a custom Marker + */ +public abstract class BaseMarkerViewOptions> implements Parcelable { + + protected LatLng position; + protected String snippet; + protected String title; + protected Icon icon; + protected boolean flat; + protected PointF centerOffset; + protected Point infoWindowOffset; + protected int selectAnimRes; + protected int deselectAnimRes; + + public BaseMarkerViewOptions() { + centerOffset = new PointF(); + infoWindowOffset = new Point(); + } + + public T position(LatLng position) { + this.position = position; + return getThis(); + } + + public T snippet(String snippet) { + this.snippet = snippet; + return getThis(); + } + + public T title(String title) { + this.title = title; + return getThis(); + } + + public T icon(Icon icon) { + this.icon = icon; + return getThis(); + } + + public T flat(boolean flat) { + this.flat = flat; + return getThis(); + } + + public T centerOffset(PointF centerOffset) { + this.centerOffset = centerOffset; + return getThis(); + } + + public T infoWindowOffset(Point infoWindowOffset) { + this.infoWindowOffset = infoWindowOffset; + return getThis(); + } + + public T selectAnimRes(int selectAnimRes) { + this.selectAnimRes = selectAnimRes; + return getThis(); + } + + public T deselectAnimRes(int deselectAnimRes) { + this.deselectAnimRes = deselectAnimRes; + return getThis(); + } + + public LatLng getPosition() { + return position; + } + + public String getSnippet() { + return snippet; + } + + public String getTitle() { + return title; + } + + public Icon getIcon() { + return icon; + } + + public boolean isFlat() { + return flat; + } + + public PointF getCenterOffset() { + return centerOffset; + } + + public Point getInfoWindowOffset() { + return infoWindowOffset; + } + + public int getSelectAnimRes() { + return selectAnimRes; + } + + public int getDeselectAnimRes() { + return deselectAnimRes; + } + + public abstract T getThis(); + + public abstract U getMarker(); + +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java index cd2cbe6645..dc83b6fc87 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Marker.java @@ -28,8 +28,6 @@ public class Marker extends Annotation { private int topOffsetPixels; private int rightOffsetPixels; - private boolean markerView; - /** * Constructor */ @@ -42,7 +40,13 @@ public class Marker extends Annotation { snippet = baseMarkerOptions.snippet; icon = baseMarkerOptions.icon; title = baseMarkerOptions.title; - markerView = baseMarkerOptions.markerView; + } + + Marker(BaseMarkerViewOptions baseMarkerViewOptions){ + position = baseMarkerViewOptions.position; + snippet = baseMarkerViewOptions.snippet; + icon = baseMarkerViewOptions.icon; + title = baseMarkerViewOptions.title; } public LatLng getPosition() { @@ -57,10 +61,6 @@ public class Marker extends Annotation { return title; } - public boolean isViewMarker() { - return markerView; - } - /** * Do not use this method. Used internally by the SDK. */ @@ -116,10 +116,6 @@ public class Marker extends Annotation { this.title = title; } - void setMarkerView(boolean isMarkerView){ - markerView = isMarkerView; - } - /** * Do not use this method. Used internally by the SDK. */ diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java index a39bf4a4a4..7ca3687b0d 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerOptions.java @@ -21,23 +21,17 @@ import com.mapbox.mapboxsdk.geometry.LatLng; */ public final class MarkerOptions extends BaseMarkerOptions implements Parcelable { - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - public MarkerOptions createFromParcel(Parcel in) { - return new MarkerOptions(in); - } + private Marker marker; - public MarkerOptions[] newArray(int size) { - return new MarkerOptions[size]; - } - }; + public MarkerOptions() { + marker = new Marker(); + } - private MarkerOptions(Parcel in) { + protected MarkerOptions(Parcel in) { marker = new Marker(); position((LatLng) in.readParcelable(LatLng.class.getClassLoader())); snippet(in.readString()); title(in.readString()); - markerView(in.readByte() != 0); if (in.readByte() != 0) { // this means we have an icon String iconId = in.readString(); @@ -63,7 +57,6 @@ public final class MarkerOptions extends BaseMarkerOptions CREATOR + = new Parcelable.Creator() { + public MarkerOptions createFromParcel(Parcel in) { + return new MarkerOptions(in); + } + + public MarkerOptions[] newArray(int size) { + return new MarkerOptions[size]; + } + }; + @Override public boolean equals(Object o) { if (this == o) return true; 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 new file mode 100644 index 0000000000..f8c36ee14b --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java @@ -0,0 +1,78 @@ +package com.mapbox.mapboxsdk.annotations; + +import android.graphics.Point; +import android.graphics.PointF; + +public class MarkerView extends Marker { + + private PointF centerOffset; + private Point infoWindowOffset; + private boolean flat; + + private int selectAnimRes; + private int deselectAnimRes; + + private float tiltValue; + + MarkerView(){ + centerOffset = new PointF(); + infoWindowOffset = new Point(); + } + + public MarkerView(BaseMarkerViewOptions baseMarkerViewOptions) { + super(baseMarkerViewOptions); + this.centerOffset = baseMarkerViewOptions.getCenterOffset(); + this.infoWindowOffset = baseMarkerViewOptions.getInfoWindowOffset(); + this.flat = baseMarkerViewOptions.isFlat(); + this.selectAnimRes = baseMarkerViewOptions.getSelectAnimRes(); + this.deselectAnimRes = baseMarkerViewOptions.getDeselectAnimRes(); + } + + public PointF getCenterOffset() { + return centerOffset; + } + + public void setCenterOffset(PointF centerOffset) { + this.centerOffset = centerOffset; + } + + public Point getInfoWindowOffset() { + return infoWindowOffset; + } + + public void setInfoWindowOffset(Point infoWindowOffset) { + this.infoWindowOffset = infoWindowOffset; + } + + public boolean isFlat() { + return flat; + } + + public void setFlat(boolean flat) { + this.flat = flat; + } + + public int getSelectAnimRes() { + return selectAnimRes; + } + + public void setSelectAnimRes(int selectAnimRes) { + this.selectAnimRes = selectAnimRes; + } + + public int getDeselectAnimRes() { + return deselectAnimRes; + } + + public void setDeselectAnimRes(int deselectAnimRes) { + this.deselectAnimRes = deselectAnimRes; + } + + public float getTiltValue() { + return tiltValue; + } + + public void setTiltValue(float tiltValue) { + this.tiltValue = tiltValue; + } +} 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 new file mode 100644 index 0000000000..f8aaf95bb2 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewOptions.java @@ -0,0 +1,142 @@ +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; + +import com.mapbox.mapboxsdk.geometry.LatLng; + +public class MarkerViewOptions extends BaseMarkerViewOptions { + + private MarkerView marker; + + public MarkerViewOptions() { + marker = new MarkerView(); + } + + protected MarkerViewOptions(Parcel in) { + marker = new MarkerView(); + position((LatLng) in.readParcelable(LatLng.class.getClassLoader())); + snippet(in.readString()); + title(in.readString()); + flat(in.readByte() != 0); + centerOffset((PointF) in.readParcelable(PointF.class.getClassLoader())); + infoWindowOffset((Point) in.readParcelable(Point.class.getClassLoader())); + selectAnimRes(in.readInt()); + deselectAnimRes(in.readInt()); + if (in.readByte() != 0) { + // this means we have an icon + String iconId = in.readString(); + Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader()); + Icon icon = new Icon(iconId, iconBitmap); + icon(icon); + } + } + + @Override + public MarkerViewOptions getThis() { + return this; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeParcelable(getPosition(), flags); + out.writeString(getSnippet()); + out.writeString(getTitle()); + out.writeByte((byte) (isFlat() ? 1 : 0)); + out.writeParcelable(getCenterOffset(),flags); + out.writeParcelable(getInfoWindowOffset(),flags); + out.writeInt(getSelectAnimRes()); + out.writeInt(getDeselectAnimRes()); + Icon icon = getIcon(); + out.writeByte((byte) (icon != null ? 1 : 0)); + if (icon != null) { + out.writeString(getIcon().getId()); + out.writeParcelable(getIcon().getBitmap(), flags); + } + } + + @Override + public MarkerView getMarker() { + marker.setPosition(position); + marker.setSnippet(snippet); + marker.setTitle(title); + marker.setIcon(icon); + marker.setFlat(flat); + marker.setCenterOffset(centerOffset); + marker.setInfoWindowOffset(infoWindowOffset); + marker.setSelectAnimRes(selectAnimRes); + marker.setDeselectAnimRes(deselectAnimRes); + return marker; + } + + public LatLng getPosition() { + return position; + } + + public String getSnippet() { + return snippet; + } + + public String getTitle() { + return title; + } + + public Icon getIcon() { + return icon; + } + + public boolean isFlat() { + return flat; + } + + public PointF getCenterOffset() { + return centerOffset; + } + + public Point getInfoWindowOffset() { + return infoWindowOffset; + } + + public int getSelectAnimRes() { + return selectAnimRes; + } + + public int getDeselectAnimRes() { + return deselectAnimRes; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public MarkerViewOptions createFromParcel(Parcel in) { + return new MarkerViewOptions(in); + } + + public MarkerViewOptions[] newArray(int size) { + return new MarkerViewOptions[size]; + } + }; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MarkerViewOptions that = (MarkerViewOptions) o; + + return marker != null ? marker.equals(that.marker) : that.marker == null; + + } + + @Override + public int hashCode() { + return marker != null ? marker.hashCode() : 0; + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java deleted file mode 100644 index cc2b0d0ccb..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewSettings.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.mapbox.mapboxsdk.annotations; - -import android.graphics.Point; -import android.graphics.PointF; -import android.support.annotation.AnimatorRes; -import android.support.annotation.NonNull; - -public class MarkerViewSettings { - - private PointF centerOffset; - private Point infoWindowOffset; - private boolean flat; - - private int selectAnimRes; - private int deselectAnimRes; - - private float tiltValue; - - MarkerViewSettings(PointF centerOffset, Point infoWindowOffset, boolean flat, int selectAnimRes, int deselectAnimRes) { - this.centerOffset = centerOffset; - this.infoWindowOffset = infoWindowOffset; - this.flat = flat; - this.selectAnimRes = selectAnimRes; - this.deselectAnimRes = deselectAnimRes; - } - - @NonNull - public PointF getCenterOffset() { - return centerOffset; - } - - @NonNull - public Point getInfoWindowOffset() { - return infoWindowOffset; - } - - @AnimatorRes - public int getSelectAnimRes() { - return selectAnimRes; - } - - @AnimatorRes - public int getDeselectAnimRes() { - return deselectAnimRes; - } - - public boolean isFlat() { - return flat; - } - - public void setTiltValue(float tilt) { - tiltValue = tilt; - } - - public float getTiltValue() { - return tiltValue; - } - - /** - * Builder for composing LatLngBounds objects. - */ - public static final class Builder { - - private PointF centerOffset; - private Point infoWindowOffset; - private boolean flat; - - private int animSelectRes; - private int animDeselectRes; - - public Builder() { - centerOffset = new PointF(); - infoWindowOffset = new Point(); - } - - public Builder centerOffset(float dx, float dy) { - centerOffset.offset(dx, dy); - return this; - } - - public Builder infoWindowOffset(int dx, int dy) { - infoWindowOffset.offset(dx, -dy); - return this; - } - - public Builder flat(boolean isFlat) { - flat = isFlat; - return this; - } - - public Builder animSelectRes(@AnimatorRes int animatorRes) { - animSelectRes = animatorRes; - return this; - } - - public Builder animDeselectRes(@AnimatorRes int animatorRes) { - animDeselectRes = animatorRes; - return this; - } - - public MarkerViewSettings build() { - return new MarkerViewSettings(centerOffset, infoWindowOffset, flat, animSelectRes, animDeselectRes); - } - } -} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 593f68814a..f2ad66b18c 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -69,6 +69,7 @@ import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.IconFactory; import com.mapbox.mapboxsdk.annotations.InfoWindow; import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.annotations.MarkerView; import com.mapbox.mapboxsdk.annotations.Polygon; import com.mapbox.mapboxsdk.annotations.Polyline; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -1109,6 +1110,33 @@ public class MapView extends FrameLayout { return new ArrayList<>(annotations); } + List getMarkerViewsInBounds(@NonNull LatLngBounds bbox) { + if (mDestroyed || bbox == null) { + return new ArrayList<>(); + } + + // TODO: filter in JNI using C++ parameter to getAnnotationsInBounds + long[] ids = mNativeMapView.getAnnotationsInBounds(bbox); + + List idsList = new ArrayList<>(ids.length); + for (int i = 0; i < ids.length; i++) { + idsList.add(ids[i]); + } + + List annotations = new ArrayList<>(ids.length); + List annotationList = mMapboxMap.getAnnotations(); + int count = annotationList.size(); + for (int i = 0; i < count; i++) { + Annotation annotation = annotationList.get(i); + if (annotation instanceof MarkerView && idsList.contains(annotation.getId())) { + annotations.add((MarkerView) annotation); + } + } + + return new ArrayList<>(annotations); + } + + int getTopOffsetPixelsForIcon(Icon icon) { if (mDestroyed) { return 0; @@ -1350,7 +1378,7 @@ public class MapView extends FrameLayout { mCompassView.update(getDirection()); mMyLocationView.update(); - Map viewMarkers = mMapboxMap.getMarkerViewMap(); + Map viewMarkers = mMapboxMap.getMarkerViewMap(); for (Marker marker : viewMarkers.keySet()) { mViewHolder = viewMarkers.get(marker); if (mViewHolder != null) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index ca3fdc21a0..75b0a88084 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -4,7 +4,6 @@ import android.content.Context; import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; -import android.content.Context; import android.graphics.Bitmap; import android.graphics.Point; import android.location.Location; @@ -26,12 +25,13 @@ import android.view.ViewGroup; import com.mapbox.mapboxsdk.annotations.Annotation; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; +import com.mapbox.mapboxsdk.annotations.BaseMarkerViewOptions; import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.IconFactory; import com.mapbox.mapboxsdk.annotations.InfoWindow; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; -import com.mapbox.mapboxsdk.annotations.MarkerViewSettings; +import com.mapbox.mapboxsdk.annotations.MarkerView; import com.mapbox.mapboxsdk.annotations.Polygon; import com.mapbox.mapboxsdk.annotations.PolygonOptions; import com.mapbox.mapboxsdk.annotations.Polyline; @@ -77,8 +77,7 @@ public class MapboxMap { private LongSparseArray mAnnotations; private List mSelectedMarkers; - private Map mMarkerViewMap; - private LongSparseArray mMarkerViewSettingsMap; + private Map mMarkerViewMap; private List mInfoWindows; private MapboxMap.InfoWindowAdapter mInfoWindowAdapter; @@ -118,7 +117,6 @@ public class MapboxMap { mSelectedMarkers = new ArrayList<>(); mInfoWindows = new ArrayList<>(); mMarkerViewMap = new HashMap<>(); - mMarkerViewSettingsMap = new LongSparseArray<>(); } // @@ -619,6 +617,7 @@ public class MapboxMap { *

* Sets the current Mapbox access token used to load map styles and tiles. *

+ * * @param accessToken Your public Mapbox access token. * @see MapView#setAccessToken(String) * @deprecated As of release 4.1.0, replaced by {@link com.mapbox.mapboxsdk.MapboxAccountManager#start(Context, String)} @@ -652,18 +651,17 @@ public class MapboxMap { // void invalidateViewMarkersInBounds() { - List markers = mMapView.getMarkersInBounds(mProjection.getVisibleRegion().latLngBounds); + List markers = mMapView.getMarkerViewsInBounds(mProjection.getVisibleRegion().latLngBounds); View convertView; // remove old markers - Iterator iterator = mMarkerViewMap.keySet().iterator(); + Iterator iterator = mMarkerViewMap.keySet().iterator(); while (iterator.hasNext()) { - Marker m = iterator.next(); + MarkerView m = iterator.next(); if (!markers.contains(m)) { // remove marker convertView = mMarkerViewMap.get(m); - MarkerViewSettings settings = mMarkerViewSettingsMap.get(m.getId()); - int deselectAnimRes = settings.getDeselectAnimRes(); + int deselectAnimRes = m.getDeselectAnimRes(); if (deselectAnimRes != 0) { Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), deselectAnimRes); animator.setDuration(0); @@ -676,34 +674,27 @@ public class MapboxMap { } // introduce new markers - for (final Marker marker : markers) { - if (marker.isViewMarker() && !mMarkerViewMap.containsKey(marker)) { + for (final MarkerView marker : markers) { + if (!mMarkerViewMap.containsKey(marker)) { for (final MarkerViewAdapter adapter : mMarkerViewAdapters) { if (adapter.getMarkerClass() == marker.getClass()) { - - MarkerViewSettings settings = mMarkerViewSettingsMap.get(marker.getId()); - if (settings == null) { - settings = adapter.getMarkerViewSettings(marker); - mMarkerViewSettingsMap.put(marker.getId(), settings); - } - convertView = (View) adapter.getViewReusePool().acquire(); View adaptedView = adapter.getView(marker, convertView, mMapView); - // infowindow offset - Point infoWindowOffset = settings.getInfoWindowOffset(); - marker.setTopOffsetPixels(infoWindowOffset.y); + // InfoWindow offset + Point infoWindowOffset = marker.getInfoWindowOffset(); + marker.setTopOffsetPixels(-infoWindowOffset.y); marker.setRightOffsetPixels(infoWindowOffset.x); if (adaptedView != null) { // tilt - adaptedView.setRotationX(settings.getTiltValue()); + adaptedView.setRotationX(marker.getTiltValue()); if (mSelectedMarkers.contains(marker)) { // if a marker to be shown was selected // replay that animation with duration 0 - int selectAnimRes = settings.getSelectAnimRes(); + int selectAnimRes = marker.getSelectAnimRes(); if (selectAnimRes != 0) { Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), selectAnimRes); animator.setDuration(0); @@ -712,7 +703,7 @@ public class MapboxMap { } } - final int animSelectRes = settings.getSelectAnimRes(); + final int animSelectRes = marker.getSelectAnimRes(); adaptedView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -752,11 +743,10 @@ public class MapboxMap { } void setTilt(double tilt) { - for (Map.Entry entry : mMarkerViewMap.entrySet()) { - MarkerViewSettings settings = mMarkerViewSettingsMap.get(entry.getKey().getId()); - if (settings.isFlat()) { - settings.setTiltValue((float) tilt); - entry.getValue().setRotationX((float) tilt); + for (MarkerView markerView : mMarkerViewMap.keySet()) { + if (markerView.isFlat()) { + markerView.setTiltValue((float) tilt); + mMarkerViewMap.get(markerView).setRotationX((float) tilt); } } mMapView.setTilt(tilt); @@ -800,6 +790,29 @@ public class MapboxMap { return marker; } + /** + *

+ * Adds a marker to this map. + *

+ * The marker's icon is rendered on the map at the location {@code Marker.position}. + * If {@code Marker.title} is defined, the map shows an info box with the marker's title and snippet. + * + * @param markerOptions A marker options object that defines how to render the marker. + * @return The {@code Marker} that was added to the map. + */ + @UiThread + @NonNull + public Marker addMarker(@NonNull BaseMarkerViewOptions markerOptions) { + Marker marker = markerOptions.getMarker(); + Icon icon = IconFactory.recreate("markerViewSettings", mViewMarkerBitmap); + marker.setIcon(icon); + long id = mMapView.addMarker(marker); + marker.setMapboxMap(this); + marker.setId(id); + mAnnotations.put(id, marker); + return marker; + } + /** *

* Adds multiple markers to this map. @@ -1284,13 +1297,15 @@ public class MapboxMap { marker.hideInfoWindow(); } - View viewMarker = mMarkerViewMap.get(marker); - if (viewMarker != null) { - int deselectAnimatorRes = mMarkerViewSettingsMap.get(marker.getId()).getDeselectAnimRes(); - if (deselectAnimatorRes != 0) { - Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), deselectAnimatorRes); - animator.setTarget(viewMarker); - animator.start(); + if (marker instanceof MarkerView) { + View viewMarker = mMarkerViewMap.get(marker); + if (viewMarker != null) { + int deselectAnimatorRes = ((MarkerView) marker).getDeselectAnimRes(); + if (deselectAnimatorRes != 0) { + Animator animator = AnimatorInflater.loadAnimator(mMapView.getContext(), deselectAnimatorRes); + animator.setTarget(viewMarker); + animator.start(); + } } } } @@ -1327,7 +1342,7 @@ public class MapboxMap { private Marker prepareMarker(BaseMarkerOptions markerOptions) { Marker marker = markerOptions.getMarker(); - if (markerOptions.isViewMarker()) { + if (marker instanceof MarkerView) { Icon icon = IconFactory.recreate("markerViewSettings", mViewMarkerBitmap); marker.setIcon(icon); } else { @@ -1407,7 +1422,7 @@ public class MapboxMap { return mInfoWindows; } - Map getMarkerViewMap() { + Map getMarkerViewMap() { return mMarkerViewMap; } @@ -1939,7 +1954,7 @@ public class MapboxMap { View getInfoWindow(@NonNull Marker marker); } - public static abstract class MarkerViewAdapter { + public static abstract class MarkerViewAdapter { private Context context; private final Class persistentClass; @@ -1966,10 +1981,6 @@ public class MapboxMap { public Context getContext() { return context; } - - public MarkerViewSettings getMarkerViewSettings(Marker marker) { - return new MarkerViewSettings.Builder().build(); - } } public interface OnMarkerViewClickListener { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java index c6b50a2e09..0818f3184f 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/BulkMarkerActivity.java @@ -23,7 +23,8 @@ import android.widget.Toast; import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; -import com.mapbox.mapboxsdk.annotations.MarkerViewSettings; +import com.mapbox.mapboxsdk.annotations.MarkerView; +import com.mapbox.mapboxsdk.annotations.MarkerViewOptions; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; @@ -82,7 +83,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView } } - public static class TextAdapter extends MapboxMap.MarkerViewAdapter { + public static class TextAdapter extends MapboxMap.MarkerViewAdapter { private LayoutInflater inflater; @@ -93,7 +94,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView @Nullable @Override - public View getView(@NonNull Marker marker, @Nullable View convertView, @NonNull ViewGroup parent) { + public View getView(@NonNull MarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); @@ -168,7 +169,7 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView } } - private class FabClickListener implements View.OnClickListener{ + private class FabClickListener implements View.OnClickListener { @Override public void onClick(View v) { if (mMapboxMap != null) { @@ -238,11 +239,18 @@ public class BulkMarkerActivity extends AppCompatActivity implements AdapterView LatLng location; for (int i = 0; i < mAmount; i++) { location = locations.get(i); - markerOptions.add(new MarkerOptions() - .position(location) - .markerView(mMarkerView) - .title(String.valueOf(i)) - .snippet(formatter.format(location.getLatitude()) + ", " + formatter.format(location.getLongitude()))); + + if (mMarkerView) { +// markerOptions.add(new MarkerViewOptions() +// .position(location) +// .title(String.valueOf(i)) +// .snippet(formatter.format(location.getLatitude()) + ", " + formatter.format(location.getLongitude()))); + } else { + markerOptions.add(new MarkerOptions() + .position(location) + .title(String.valueOf(i)) + .snippet(formatter.format(location.getLatitude()) + ", " + formatter.format(location.getLongitude()))); + } } } catch (IOException | JSONException e) { Log.e(TAG, "Could not add markers,", e); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java index ef04b7abf3..0dcc638191 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerAdapterActivity.java @@ -1,12 +1,14 @@ package com.mapbox.mapboxsdk.testapp.activity.annotation; import android.content.Context; +import android.graphics.Point; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -17,7 +19,9 @@ import android.widget.Toast; import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.MarkerOptions; -import com.mapbox.mapboxsdk.annotations.MarkerViewSettings; +import com.mapbox.mapboxsdk.annotations.MarkerView; +import com.mapbox.mapboxsdk.annotations.MarkerViewOptions; +import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; @@ -25,6 +29,8 @@ import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.mapbox.mapboxsdk.testapp.R; import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarker; import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarkerOptions; +import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarkerView; +import com.mapbox.mapboxsdk.testapp.model.annotations.CountryMarkerViewOptions; public class ViewMarkerAdapterActivity extends AppCompatActivity { @@ -66,20 +72,27 @@ public class ViewMarkerAdapterActivity extends AppCompatActivity { // add text markers for (int i = 0; i < LAT_LNGS.length; i++) { - mMapboxMap.addMarker(new MarkerOptions() + mMapboxMap.addMarker(new MarkerViewOptions() .position(LAT_LNGS[i]) - .markerView(true) - .title(String.valueOf(i))); + .title(String.valueOf(i)) + .infoWindowOffset(new Point(0,32)) + .selectAnimRes(R.animator.scale_up) + .deselectAnimRes(R.animator.scale_down) + ); } // add flag marker - mMapboxMap.addMarker(new CountryMarkerOptions() - .markerView(true) - .title("United States") - .abbrevName("us") - .flagRes(R.drawable.ic_us) - .position(new LatLng(38.899774, -77.023237)) - ); + CountryMarkerViewOptions options = new CountryMarkerViewOptions(); + options.title("United States"); + options.abbrevName("us"); + options.flagRes(R.drawable.ic_us); + options.position(new LatLng(38.899774, -77.023237)); + options.selectAnimRes(R.animator.rotate_360); + options.deselectAnimRes(R.animator.rotate_360); + options.infoWindowOffset(new Point(0, 64)); + options.flat(true); + + mapboxMap.addMarker(options); // default GL marker mMapboxMap.addMarker(new CountryMarkerOptions() @@ -113,7 +126,7 @@ public class ViewMarkerAdapterActivity extends AppCompatActivity { }); } - private static class TextAdapter extends MapboxMap.MarkerViewAdapter { + private static class TextAdapter extends MapboxMap.MarkerViewAdapter { private LayoutInflater inflater; @@ -124,7 +137,7 @@ public class ViewMarkerAdapterActivity extends AppCompatActivity { @Nullable @Override - public View getView(@NonNull Marker marker, @Nullable View convertView, @NonNull ViewGroup parent) { + public View getView(@NonNull MarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); @@ -134,31 +147,17 @@ public class ViewMarkerAdapterActivity extends AppCompatActivity { } else { viewHolder = (ViewHolder) convertView.getTag(); } + Log.v(MapboxConstants.TAG,"SSSSST"); viewHolder.title.setText(marker.getTitle()); return convertView; } - @Override - public MarkerViewSettings getMarkerViewSettings(Marker marker) { - MarkerViewSettings.Builder builder = new MarkerViewSettings.Builder() - .animSelectRes(R.animator.scale_up) - .animDeselectRes(R.animator.scale_down) - .infoWindowOffset(0, (int) getContext().getResources() - .getDimension(R.dimen.coordinatebounds_margin)); - - if (marker.getId() == 0) { - builder.flat(true); - } - - return builder.build(); - } - private static class ViewHolder { TextView title; } } - private static class CountryAdapter extends MapboxMap.MarkerViewAdapter { + private static class CountryAdapter extends MapboxMap.MarkerViewAdapter { private LayoutInflater inflater; @@ -169,7 +168,7 @@ public class ViewMarkerAdapterActivity extends AppCompatActivity { @Nullable @Override - public View getView(@NonNull CountryMarker marker, @Nullable View convertView, @NonNull ViewGroup parent) { + public View getView(@NonNull CountryMarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); @@ -180,22 +179,12 @@ public class ViewMarkerAdapterActivity extends AppCompatActivity { } else { viewHolder = (ViewHolder) convertView.getTag(); } + Log.v(MapboxConstants.TAG,"TESTSSSSS"); viewHolder.flag.setImageResource(marker.getFlagRes()); viewHolder.abbrev.setText(marker.getAbbrevName()); return convertView; } - @Override - public MarkerViewSettings getMarkerViewSettings(Marker marker) { - return new MarkerViewSettings.Builder() - .animSelectRes(R.animator.rotate_360) - .animDeselectRes(R.animator.rotate_360) - .infoWindowOffset(0, (int) getContext().getResources() - .getDimension(R.dimen.fab_margin)) - .flat(true) - .build(); - } - private static class ViewHolder { ImageView flag; TextView abbrev; diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerView.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerView.java new file mode 100644 index 0000000000..64f0565026 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerView.java @@ -0,0 +1,24 @@ +package com.mapbox.mapboxsdk.testapp.model.annotations; + +import com.mapbox.mapboxsdk.annotations.BaseMarkerViewOptions; +import com.mapbox.mapboxsdk.annotations.MarkerView; + +public class CountryMarkerView extends MarkerView { + + private String abbrevName; + private int flagRes; + + public CountryMarkerView(BaseMarkerViewOptions baseMarkerViewOptions, String abbrevName, int flagRes) { + super(baseMarkerViewOptions); + this.abbrevName = abbrevName; + this.flagRes = flagRes; + } + + public String getAbbrevName() { + return abbrevName; + } + + public int getFlagRes() { + return flagRes; + } +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerViewOptions.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerViewOptions.java new file mode 100644 index 0000000000..c61c874720 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/model/annotations/CountryMarkerViewOptions.java @@ -0,0 +1,127 @@ +package com.mapbox.mapboxsdk.testapp.model.annotations; + +import android.graphics.Bitmap; +import android.graphics.Point; +import android.graphics.PointF; +import android.os.Parcel; +import android.os.Parcelable; + +import com.mapbox.mapboxsdk.annotations.BaseMarkerViewOptions; +import com.mapbox.mapboxsdk.annotations.Icon; +import com.mapbox.mapboxsdk.annotations.IconFactory; +import com.mapbox.mapboxsdk.geometry.LatLng; + +public class CountryMarkerViewOptions extends BaseMarkerViewOptions { + + private String abbrevName; + private int flagRes; + + public CountryMarkerViewOptions() { + } + + protected CountryMarkerViewOptions(Parcel in) { + position((LatLng) in.readParcelable(LatLng.class.getClassLoader())); + snippet(in.readString()); + title(in.readString()); + flat(in.readByte() != 0); + centerOffset((PointF) in.readParcelable(PointF.class.getClassLoader())); + infoWindowOffset((Point) in.readParcelable(Point.class.getClassLoader())); + selectAnimRes(in.readInt()); + deselectAnimRes(in.readInt()); + if (in.readByte() != 0) { + // this means we have an icon + String iconId = in.readString(); + Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader()); + Icon icon = IconFactory.recreate(iconId, iconBitmap); + icon(icon); + } + } + + @Override + public CountryMarkerViewOptions getThis() { + return this; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeParcelable(getPosition(), flags); + out.writeString(getSnippet()); + out.writeString(getTitle()); + out.writeByte((byte) (isFlat() ? 1 : 0)); + out.writeParcelable(getCenterOffset(), flags); + out.writeParcelable(getInfoWindowOffset(), flags); + out.writeInt(getSelectAnimRes()); + out.writeInt(getDeselectAnimRes()); + Icon icon = getIcon(); + out.writeByte((byte) (icon != null ? 1 : 0)); + if (icon != null) { + out.writeString(getIcon().getId()); + out.writeParcelable(getIcon().getBitmap(), flags); + } + } + + @Override + public CountryMarkerView getMarker() { + return new CountryMarkerView(this, abbrevName, flagRes); + } + + public CountryMarkerViewOptions abbrevName(String abbrevName) { + this.abbrevName = abbrevName; + return getThis(); + } + + public CountryMarkerViewOptions flagRes(int flagRes) { + this.flagRes = flagRes; + return getThis(); + } + + public LatLng getPosition() { + return position; + } + + public String getSnippet() { + return snippet; + } + + public String getTitle() { + return title; + } + + public boolean isFlat() { + return flat; + } + + public PointF getCenterOffset() { + return centerOffset; + } + + public Point getInfoWindowOffset() { + return infoWindowOffset; + } + + public int getSelectAnimRes() { + return selectAnimRes; + } + + public int getDeselectAnimRes() { + return deselectAnimRes; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public CountryMarkerViewOptions createFromParcel(Parcel in) { + return new CountryMarkerViewOptions(in); + } + + public CountryMarkerViewOptions[] newArray(int size) { + return new CountryMarkerViewOptions[size]; + } + }; + + +} \ No newline at end of file -- cgit v1.2.1