diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations')
6 files changed, 249 insertions, 173 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java index 36d56591c8..3c4868c84b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/Annotation.java @@ -23,6 +23,7 @@ public abstract class Annotation implements Comparable<Annotation> { */ private long id = -1; // -1 unless added to a MapView protected MapboxMap mapboxMap; + protected MapView mapView; protected Annotation() { } @@ -68,6 +69,22 @@ public abstract class Annotation implements Comparable<Annotation> { return mapboxMap; } + /** + * Don not use this method. Used internally by the SDK. + */ + public void setMapView(MapView mapView) { + this.mapView = mapView; + } + + /** + * Gets the associated MapView + * + * @return The MapView + */ + protected MapView getMapView() { + return mapView; + } + @Override public int compareTo(@NonNull Annotation annotation) { if (id < annotation.getId()) { 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 0cd54fc0f0..2a41fad234 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,7 @@ package com.mapbox.mapboxsdk.annotations; import android.os.Parcelable; -import android.support.annotation.AnimatorRes; +import android.support.annotation.FloatRange; import android.support.annotation.NonNull; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -26,10 +26,9 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base protected float anchorV = 1f; protected float infoWindowAnchorU = 0.5f; protected float infoWindowAnchorV = 0.0f; - protected int selectAnimRes; - protected int deselectAnimRes; - protected int rotation; + protected float rotation; protected boolean visible = true; + protected boolean selected; /** * Default constructor @@ -99,7 +98,7 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base * @param v the v-value * @return the object for which the method was called */ - public T anchor(float u, float v) { + public T anchor(@FloatRange(from = 0.0, to = 1.0) float u, @FloatRange(from = 0.0, to = 1.0) float v) { this.anchorU = u; this.anchorV = v; return getThis(); @@ -112,41 +111,19 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base * @param v the v-values * @return the object for which the method was called */ - public T infoWindowAnchor(float u, float v) { + public T infoWindowAnchor(@FloatRange(from = 0.0, to = 1.0) float u, @FloatRange(from = 0.0, to = 1.0) float v) { this.infoWindowAnchorU = u; this.infoWindowAnchorV = v; return getThis(); } /** - * Set the animator resource to be used when an MarkerView is selected. - * - * @param selectAnimRes the used animator resource - * @return the object for which the method was called - */ - public T selectAnimatorResource(@AnimatorRes int selectAnimRes) { - this.selectAnimRes = selectAnimRes; - return getThis(); - } - - /** - * Set the animator resource to be used when an MarkerView is deselected. - * - * @param deselectAnimRes the used animator resource - * @return the object for which the method was called - */ - public T deselectAnimatorResource(@AnimatorRes int deselectAnimRes) { - this.deselectAnimRes = deselectAnimRes; - return getThis(); - } - - /** * Set the rotation of the MarkerView. * * @param rotation the rotation value * @return the object for which the method was called */ - public T rotation(int rotation) { + public T rotation(float rotation) { this.rotation = rotation; return getThis(); } @@ -244,29 +221,11 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base } /** - * Get the animator resource used for selecting the MarkerView. - * - * @return the animator resource - */ - public int getSelectAnimRes() { - return selectAnimRes; - } - - /** - * Get the animator resource used for deselecting the MarkerView. - * - * @return the animator resource - */ - public int getDeselectAnimRes() { - return deselectAnimRes; - } - - /** * Get the rotation of the MarkerView. * * @return the rotation value */ - public int getRotation() { + public float getRotation() { return rotation; } 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 16b219684f..2d4ec4257e 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 @@ -3,7 +3,6 @@ package com.mapbox.mapboxsdk.annotations; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; - import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; @@ -91,8 +90,9 @@ public class Marker extends Annotation { } } - void setSnippet(String snippet) { + public void setSnippet(String snippet) { this.snippet = snippet; + refreshInfoWindowContent(); } /** @@ -112,8 +112,25 @@ public class Marker extends Annotation { return icon; } - void setTitle(String title) { + public void setTitle(String title) { this.title = title; + refreshInfoWindowContent(); + } + + /** + * Update only for default Marker's InfoWindow content for Title and Snippet + */ + private void refreshInfoWindowContent() { + if (isInfoWindowShown() && mapView != null && mapboxMap != null && mapboxMap.getInfoWindowAdapter() == null) { + InfoWindow infoWindow = getInfoWindow(mapView); + if (mapView.getContext() != null) { + infoWindow.adaptDefaultMarker(this, mapboxMap, mapView); + } + MapboxMap map = getMapboxMap(); + if (map != null) { + map.updateMarker(this); + } + } } /** @@ -121,6 +138,7 @@ public class Marker extends Annotation { */ public InfoWindow showInfoWindow(@NonNull MapboxMap mapboxMap, @NonNull MapView mapView) { setMapboxMap(mapboxMap); + setMapView(mapView); MapboxMap.InfoWindowAdapter infoWindowAdapter = getMapboxMap().getInfoWindowAdapter(); if (infoWindowAdapter != null) { // end developer is using a custom InfoWindowAdapter 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 3e51044643..49d7a061d0 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,5 +1,12 @@ package com.mapbox.mapboxsdk.annotations; +import android.graphics.Bitmap; +import android.support.annotation.FloatRange; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.view.View; + +import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.maps.MapboxMap; /** @@ -28,13 +35,14 @@ public class MarkerView extends Marker { private boolean flat; private boolean visible = true; - private int selectAnimRes; - private int deselectAnimRes; - private float tiltValue; private float rotation; private float alpha = 1; + private Icon markerViewIcon; + + private boolean selected; + /** * Publicly hidden default constructor */ @@ -53,12 +61,11 @@ public class MarkerView extends Marker { 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; + this.selected = baseMarkerViewOptions.selected; } /** @@ -71,7 +78,7 @@ public class MarkerView extends Marker { * @param u u-coordinate of the anchor, as a ratio of the image width (in the range [0, 1]) * @param v v-coordinate of the anchor, as a ratio of the image height (in the range [0, 1]) */ - public void setAnchor(float u, float v) { + public void setAnchor(@FloatRange(from = 0.0, to = 1.0) float u, @FloatRange(from = 0.0, to = 1.0) float v) { this.anchorU = u; this.anchorV = v; } @@ -149,7 +156,7 @@ public class MarkerView extends Marker { * @param v v-coordinate of the info window anchor, as a ratio of the image height (in the range [0, 1]) * @see #setAnchor(float, float) for more details. */ - public void setInfoWindowAnchor(float u, float v) { + public void setInfoWindowAnchor(@FloatRange(from = 0.0, to = 1.0) float u, @FloatRange(from = 0.0, to = 1.0) float v) { this.infoWindowAnchorU = u; this.infoWindowAnchorV = v; } @@ -191,42 +198,6 @@ public class MarkerView extends Marker { } /** - * Get the animator resource used to animate to the selected state of a MarkerView. - * - * @return the animator resource used - */ - public int getSelectAnimRes() { - return selectAnimRes; - } - - /** - * Set the animator resource used to animate to the deselected state of a MarkerView. - * - * @param selectAnimRes the animator resource used - */ - public void setSelectAnimRes(int selectAnimRes) { - this.selectAnimRes = selectAnimRes; - } - - /** - * Get the animator resource used to animate to the deslected state of a MarkerView. - * - * @return the animator resource used - */ - public int getDeselectAnimRes() { - return deselectAnimRes; - } - - /** - * Set the animator resource used to animate to the selected state of a MarkerView. - * - * @param deselectAnimRes the animator resource used - */ - public void setDeselectAnimRes(int deselectAnimRes) { - this.deselectAnimRes = deselectAnimRes; - } - - /** * Internal method to get the current tilted value of a MarkerView. * * @return the tilted value @@ -240,7 +211,7 @@ public class MarkerView extends Marker { * * @param tiltValue the tilted value to set */ - void setTilt(float tiltValue) { + void setTilt(@FloatRange(from = 0.0, to = MapboxConstants.MAXIMUM_TILT) float tiltValue) { this.tiltValue = tiltValue; } @@ -308,7 +279,7 @@ public class MarkerView extends Marker { * * @param alpha the alpha value to animate to */ - public void setAlpha(float alpha) { + public void setAlpha(@FloatRange(from=0.0, to=255.0)float alpha) { this.alpha = alpha; if (markerViewManager != null) { markerViewManager.animateAlpha(this, alpha); @@ -316,6 +287,45 @@ public class MarkerView extends Marker { } /** + * Set the icon of the MarkerView. + * + * @param icon the icon to be used as Marker image + */ + @Override + public void setIcon(@Nullable Icon icon) { + if (icon != null) { + markerViewIcon = IconFactory.recreate("icon", icon.getBitmap()); + } + Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + Icon transparentIcon = IconFactory.recreate("markerViewSettings", bitmap); + if (markerViewManager != null) { + markerViewManager.updateIcon(this); + } + super.setIcon(transparentIcon); + } + + public boolean isSelected() { + return selected; + } + + /** + * For internal use only, use {@link MapboxMap#selectMarker(Marker)} instead. + */ + void setSelected(boolean selected) { + this.selected = selected; + } + + /** + * Get the icon of the MarkerView. + * + * @return the icon use as Marker image + */ + @Override + public Icon getIcon() { + return markerViewIcon; + } + + /** * Set the MapboxMap associated tot the MapView containing the MarkerView. * <p> * This method is used to instantiate the MarkerView and provide an instance of {@link com.mapbox.mapboxsdk.maps.MapboxMap.MarkerViewAdapter} 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 d9fc9e62ae..bcb3176bfd 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,12 +1,17 @@ package com.mapbox.mapboxsdk.annotations; +import android.content.Context; import android.graphics.PointF; import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.Pools; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.Projection; @@ -26,12 +31,13 @@ import java.util.Map; */ public class MarkerViewManager { - private Map<MarkerView, View> mMarkerViewMap; + private Map<MarkerView, View> markerViewMap; private MapboxMap mapboxMap; private MapView mapView; private List<MapboxMap.MarkerViewAdapter> markerViewAdapters; - private long mViewMarkerBoundsUpdateTime; + private long viewMarkerBoundsUpdateTime; private MapboxMap.OnMarkerViewClickListener onMarkerViewClickListener; + private ImageMarkerViewAdapter defaultMarkerViewAdapter; /** * Creates an instance of MarkerViewManager. @@ -43,7 +49,9 @@ public class MarkerViewManager { this.mapboxMap = mapboxMap; this.markerViewAdapters = new ArrayList<>(); this.mapView = mapView; - mMarkerViewMap = new HashMap<>(); + this.markerViewMap = new HashMap<>(); + this.defaultMarkerViewAdapter = new ImageMarkerViewAdapter(mapView.getContext()); + this.markerViewAdapters.add(defaultMarkerViewAdapter); } /** @@ -56,7 +64,7 @@ public class MarkerViewManager { * @param rotation the rotation value */ public void animateRotation(@NonNull MarkerView marker, float rotation) { - View convertView = mMarkerViewMap.get(marker); + View convertView = markerViewMap.get(marker); if (convertView != null) { AnimatorUtils.rotate(convertView, rotation); } @@ -72,7 +80,7 @@ public class MarkerViewManager { * @param alpha the alpha value */ public void animateAlpha(@NonNull MarkerView marker, float alpha) { - View convertView = mMarkerViewMap.get(marker); + View convertView = markerViewMap.get(marker); if (convertView != null) { AnimatorUtils.alpha(convertView, alpha); } @@ -88,7 +96,7 @@ public class MarkerViewManager { * @param visible the flag indicating if MarkerView is visible */ public void animateVisible(@NonNull MarkerView marker, boolean visible) { - View convertView = mMarkerViewMap.get(marker); + View convertView = markerViewMap.get(marker); if (convertView != null) { convertView.setVisibility(visible ? View.VISIBLE : View.GONE); } @@ -104,8 +112,8 @@ public class MarkerViewManager { */ public void update() { View convertView; - for (MarkerView marker : mMarkerViewMap.keySet()) { - convertView = mMarkerViewMap.get(marker); + for (MarkerView marker : markerViewMap.keySet()) { + convertView = markerViewMap.get(marker); if (convertView != null) { PointF point = mapboxMap.getProjection().toScreenLocation(marker.getPosition()); int x = (int) (marker.getAnchorU() * convertView.getMeasuredWidth()); @@ -133,9 +141,9 @@ public class MarkerViewManager { */ public void setTilt(float tilt) { View convertView; - for (MarkerView markerView : mMarkerViewMap.keySet()) { + for (MarkerView markerView : markerViewMap.keySet()) { if (markerView.isFlat()) { - convertView = mMarkerViewMap.get(markerView); + convertView = markerViewMap.get(markerView); if (convertView != null) { markerView.setTilt(tilt); convertView.setRotationX(tilt); @@ -145,69 +153,118 @@ public class MarkerViewManager { } /** + * + */ + public void updateIcon(@NonNull MarkerView markerView) { + View convertView = markerViewMap.get(markerView); + if (convertView != null && convertView instanceof ImageView) { + ((ImageView) convertView).setImageBitmap(markerView.getIcon().getBitmap()); + } + } + + /** * Animate a MarkerView to a deselected state. * <p> - * The {@link MarkerView#getDeselectAnimRes()} will be called to get the related animation. - * If non are provided, no animation will be started. + * The {@link com.mapbox.mapboxsdk.maps.MapboxMap.MarkerViewAdapter#onDeselect(MarkerView, View)} will be called to execute an animation. * </p> * * @param marker the MarkerView to deselect */ public void deselect(@NonNull MarkerView marker) { - final View convertView = mMarkerViewMap.get(marker); + final View convertView = markerViewMap.get(marker); + if (convertView != null) { + for (MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { + if (adapter.getMarkerClass().equals(marker.getClass())) { + adapter.onDeselect(marker, convertView); + } + } + } + } + + /** + * Animate a MarkerView to a selected state. + * + * @param marker the MarkerView object to select + */ + public void select(@NonNull MarkerView marker) { + final View convertView = markerViewMap.get(marker); + for (MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { + if (adapter.getMarkerClass().equals(marker.getClass())) { + select(marker, convertView, adapter); + } + } + } + + /** + * Animate a MarkerView to a selected state. + * <p> + * The {@link com.mapbox.mapboxsdk.maps.MapboxMap.MarkerViewAdapter#onSelect(MarkerView, View, boolean)} will be called to execute an animation. + * </p> + * @param marker the MarkerView object to select + * @param convertView the View presentation of the MarkerView + * @param adapter the adapter used to adapt the marker to the convertView + */ + public void select(@NonNull MarkerView marker, View convertView, MapboxMap.MarkerViewAdapter adapter) { if (convertView != null) { - int deselectAnimatorRes = marker.getDeselectAnimRes(); - if (deselectAnimatorRes != 0) { - AnimatorUtils.animate(convertView, deselectAnimatorRes); + if (adapter.onSelect(marker, convertView, false)) { + mapboxMap.selectMarker(marker); } + marker.setSelected(true); } } /** + * Get view representation from a MarkerView. + * <p> + * If marker is not found in current viewport, null is returned. + * </p> + * + * @param marker the marker to get the view for + * @return the android SDK View object + */ + @Nullable + public View getView(MarkerView marker) { + return markerViewMap.get(marker); + } + + /** * Remove a MarkerView from a map. * <p> * The {@link MarkerView} will be removed using an alpha animation and related {@link View} - * will be released to the {@link android.support.v4.util.Pools.SimplePool} from the related + * will be released to the android.support.v4.util.Pools.SimplePool from the related * {@link com.mapbox.mapboxsdk.maps.MapboxMap.MarkerViewAdapter}. It's possible to remove * the {@link MarkerView} from the underlying collection if needed. * </p> * - * @param marker the MarkerView to remove - * @param removeFromMap flag indicating if a MarkerView will be removed from the collection. + * @param marker the MarkerView to remove */ - public void removeMarkerView(MarkerView marker, boolean removeFromMap) { - final View viewHolder = mMarkerViewMap.get(marker); + public void removeMarkerView(MarkerView marker) { + final View viewHolder = markerViewMap.get(marker); if (viewHolder != null && marker != null) { for (final MapboxMap.MarkerViewAdapter<?> adapter : markerViewAdapters) { - if (adapter.getMarkerClass() == marker.getClass()) { - - // get pool of Views associated to an adapter - final Pools.SimplePool<View> viewPool = adapter.getViewReusePool(); - - // cancel ongoing animations - viewHolder.animate().cancel(); - viewHolder.setAlpha(1); - AnimatorUtils.alpha(viewHolder, 0, new AnimatorUtils.OnAnimationEndListener() { - @Override - public void onAnimationEnd() { - viewHolder.setVisibility(View.GONE); - viewPool.release(viewHolder); - } - }); + if (adapter.getMarkerClass().equals(marker.getClass())) { + if (adapter.prepareViewForReuse(marker, viewHolder)) { + adapter.releaseView(viewHolder); + } } } } - if (removeFromMap) { - mMarkerViewMap.remove(marker); - } + markerViewMap.remove(marker); } /** - * Add a MarkerViewAdapter. + * Add a MarkerViewAdapter to the MarkerViewManager. + * <p> + * The provided MarkerViewAdapter must use supply a generic subclass of MarkerView. + * </p> * * @param markerViewAdapter the MarkerViewAdapter to add */ - public void addMarkerViewAdapter(@Nullable MapboxMap.MarkerViewAdapter markerViewAdapter) { + public void addMarkerViewAdapter(MapboxMap.MarkerViewAdapter markerViewAdapter) { + if (markerViewAdapter.getMarkerClass().equals(MarkerView.class)) { + throw new RuntimeException("Providing a custom MarkerViewAdapter requires subclassing MarkerView"); + } + if (!markerViewAdapters.contains(markerViewAdapter)) { markerViewAdapters.add(markerViewAdapter); invalidateViewMarkersInBounds(); @@ -223,7 +280,6 @@ public class MarkerViewManager { return markerViewAdapters; } - /** * Register a callback to be invoked when this view is clicked. * @@ -243,11 +299,11 @@ public class MarkerViewManager { public void scheduleViewMarkerInvalidation() { if (!markerViewAdapters.isEmpty()) { long currentTime = SystemClock.elapsedRealtime(); - if (currentTime < mViewMarkerBoundsUpdateTime) { + if (currentTime < viewMarkerBoundsUpdateTime) { return; } invalidateViewMarkersInBounds(); - mViewMarkerBoundsUpdateTime = currentTime + 250; + viewMarkerBoundsUpdateTime = currentTime + 250; } } @@ -264,26 +320,27 @@ public class MarkerViewManager { View convertView; // remove old markers - Iterator<MarkerView> iterator = mMarkerViewMap.keySet().iterator(); + Iterator<MarkerView> iterator = markerViewMap.keySet().iterator(); while (iterator.hasNext()) { MarkerView m = iterator.next(); if (!markers.contains(m)) { // remove marker - convertView = mMarkerViewMap.get(m); - int deselectAnimRes = m.getDeselectAnimRes(); - if (deselectAnimRes != 0) { - AnimatorUtils.animate(convertView, deselectAnimRes, 0); + convertView = markerViewMap.get(m); + for (MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { + if (adapter.getMarkerClass().equals(m.getClass())) { + adapter.prepareViewForReuse(m, convertView); + adapter.releaseView(convertView); + iterator.remove(); + } } - removeMarkerView(m, false); - iterator.remove(); } } // introduce new markers for (final MarkerView marker : markers) { - if (!mMarkerViewMap.containsKey(marker)) { + if (!markerViewMap.containsKey(marker)) { for (final MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { - if (adapter.getMarkerClass() == marker.getClass()) { + if (adapter.getMarkerClass().equals(marker.getClass())) { convertView = (View) adapter.getViewReusePool().acquire(); final View adaptedView = adapter.getView(marker, convertView, mapView); if (adaptedView != null) { @@ -303,13 +360,11 @@ public class MarkerViewManager { if (mapboxMap.getSelectedMarkers().contains(marker)) { // if a marker to be shown was selected // replay that animation with duration 0 - int selectAnimRes = marker.getSelectAnimRes(); - if (selectAnimRes != 0) { - AnimatorUtils.animate(convertView, selectAnimRes, 0); + if (adapter.onSelect(marker, adaptedView, true)) { + mapboxMap.selectMarker(marker); } } - final int animSelectRes = marker.getSelectAnimRes(); adaptedView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { @@ -324,22 +379,12 @@ public class MarkerViewManager { 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() { - @Override - public void onAnimationEnd() { - mapboxMap.selectMarker(marker); - } - }); - } else { - mapboxMap.selectMarker(marker); - } + select(marker, v, adapter); } } }); - mMarkerViewMap.put(marker, adaptedView); + markerViewMap.put(marker, adaptedView); if (convertView == null) { mapView.addView(adaptedView); } @@ -349,4 +394,37 @@ public class MarkerViewManager { } } } + + /** + * Default MarkerViewAdapter used for base class of MarkerView to adapt a MarkerView to an ImageView + */ + public static class ImageMarkerViewAdapter extends MapboxMap.MarkerViewAdapter<MarkerView> { + + private LayoutInflater inflater; + + public ImageMarkerViewAdapter(Context context) { + super(context); + inflater = LayoutInflater.from(context); + } + + @Nullable + @Override + public View getView(@NonNull MarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) { + ViewHolder viewHolder; + if (convertView == null) { + viewHolder = new ViewHolder(); + convertView = inflater.inflate(R.layout.view_image_marker, parent, false); + viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image); + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + viewHolder.imageView.setImageBitmap(marker.getIcon().getBitmap()); + return convertView; + } + + private static class ViewHolder { + ImageView imageView; + } + } } 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 0c9faed355..c6735a3c8d 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 @@ -28,9 +28,7 @@ public class MarkerViewOptions extends BaseMarkerViewOptions<MarkerView, MarkerV flat(in.readByte() != 0); anchor(in.readFloat(), in.readFloat()); infoWindowAnchor(in.readFloat(), in.readFloat()); - selectAnimatorResource(in.readInt()); - deselectAnimatorResource(in.readInt()); - rotation(in.readInt()); + rotation(in.readFloat()); visible(in.readByte() != 0); if (in.readByte() != 0) { // this means we have an icon @@ -61,9 +59,7 @@ public class MarkerViewOptions extends BaseMarkerViewOptions<MarkerView, MarkerV out.writeFloat(getAnchorV()); out.writeFloat(getInfoWindowAnchorU()); out.writeFloat(getInfoWindowAnchorV()); - out.writeInt(getSelectAnimRes()); - out.writeInt(getDeselectAnimRes()); - out.writeInt(getRotation()); + out.writeFloat(getRotation()); out.writeByte((byte) (isVisible() ? 1 : 0)); Icon icon = getIcon(); out.writeByte((byte) (icon != null ? 1 : 0)); @@ -82,8 +78,6 @@ public class MarkerViewOptions extends BaseMarkerViewOptions<MarkerView, MarkerV marker.setFlat(flat); marker.setAnchor(anchorU, anchorV); marker.setInfoWindowAnchor(infoWindowAnchorU, infoWindowAnchorV); - marker.setSelectAnimRes(selectAnimRes); - marker.setDeselectAnimRes(deselectAnimRes); marker.setRotation(rotation); marker.setVisible(visible); return marker; |