From 087cad037fe0ef57884b4a351a7ecb13248925e5 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 2 Jun 2016 15:14:07 +0200 Subject: [android] #5214 - remove requirement adapter for MarkerView, allow using Icon instead --- .../mapbox/mapboxsdk/annotations/MarkerView.java | 33 ++++++++ .../mapboxsdk/annotations/MarkerViewManager.java | 88 +++++++++++++++++----- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 6 +- .../src/main/res/layout/view_image_marker.xml | 5 ++ .../activity/annotation/MarkerViewActivity.java | 58 ++++---------- .../src/main/res/layout/view_custom_marker.xml | 4 +- 6 files changed, 127 insertions(+), 67 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/res/layout/view_image_marker.xml (limited to 'platform') 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..d0e47110f4 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,8 @@ package com.mapbox.mapboxsdk.annotations; +import android.graphics.Bitmap; +import android.support.annotation.Nullable; + import com.mapbox.mapboxsdk.maps.MapboxMap; /** @@ -35,6 +38,8 @@ public class MarkerView extends Marker { private float rotation; private float alpha = 1; + private Icon markerViewIcon; + /** * Publicly hidden default constructor */ @@ -315,6 +320,34 @@ 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); + } + + /** + * 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. *

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..39e17fd683 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 mMarkerViewMap; + private Map markerViewMap; private MapboxMap mapboxMap; private MapView mapView; private List markerViewAdapters; - private long mViewMarkerBoundsUpdateTime; + private long viewMarkerBoundsUpdateTime; private MapboxMap.OnMarkerViewClickListener onMarkerViewClickListener; + private ImageMarkerViewAdapter defaultMarkerViewAdapter; /** * Creates an instance of MarkerViewManager. @@ -43,7 +49,10 @@ 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()); + // FIXME only add this if a MarkerView instance is added to MapboxMap + this.markerViewAdapters.add(defaultMarkerViewAdapter); } /** @@ -56,7 +65,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 +81,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 +97,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 +113,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 +142,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); @@ -144,6 +153,16 @@ 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. *

@@ -154,7 +173,7 @@ public class MarkerViewManager { * @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) { int deselectAnimatorRes = marker.getDeselectAnimRes(); if (deselectAnimatorRes != 0) { @@ -176,7 +195,7 @@ public class MarkerViewManager { * @param removeFromMap flag indicating if a MarkerView will be removed from the collection. */ public void removeMarkerView(MarkerView marker, boolean removeFromMap) { - final View viewHolder = mMarkerViewMap.get(marker); + final View viewHolder = markerViewMap.get(marker); if (viewHolder != null && marker != null) { for (final MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { if (adapter.getMarkerClass() == marker.getClass()) { @@ -198,7 +217,7 @@ public class MarkerViewManager { } } if (removeFromMap) { - mMarkerViewMap.remove(marker); + markerViewMap.remove(marker); } } @@ -223,7 +242,6 @@ public class MarkerViewManager { return markerViewAdapters; } - /** * Register a callback to be invoked when this view is clicked. * @@ -243,11 +261,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,12 +282,12 @@ public class MarkerViewManager { View convertView; // remove old markers - Iterator iterator = mMarkerViewMap.keySet().iterator(); + Iterator iterator = markerViewMap.keySet().iterator(); while (iterator.hasNext()) { MarkerView m = iterator.next(); if (!markers.contains(m)) { // remove marker - convertView = mMarkerViewMap.get(m); + convertView = markerViewMap.get(m); int deselectAnimRes = m.getDeselectAnimRes(); if (deselectAnimRes != 0) { AnimatorUtils.animate(convertView, deselectAnimRes, 0); @@ -281,7 +299,7 @@ public class MarkerViewManager { // 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()) { convertView = (View) adapter.getViewReusePool().acquire(); @@ -339,7 +357,7 @@ public class MarkerViewManager { } }); - mMarkerViewMap.put(marker, adaptedView); + markerViewMap.put(marker, adaptedView); if (convertView == null) { mapView.addView(adaptedView); } @@ -349,4 +367,34 @@ public class MarkerViewManager { } } } + + public static class ImageMarkerViewAdapter extends MapboxMap.MarkerViewAdapter { + + 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/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index a19588b8c4..89ff6b9fc7 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 @@ -72,7 +72,6 @@ public class MapboxMap { private List mInfoWindows; private MapboxMap.InfoWindowAdapter mInfoWindowAdapter; - private Bitmap mViewMarkerBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); private boolean mMyLocationEnabled; private boolean mAllowConcurrentMultipleInfoWindows; @@ -703,8 +702,8 @@ public class MapboxMap { @NonNull public MarkerView addMarker(@NonNull BaseMarkerViewOptions markerOptions) { MarkerView marker = prepareViewMarker(markerOptions); - long id = mMapView.addMarker(marker); marker.setMapboxMap(this); + long id = mMapView.addMarker(marker); marker.setId(id); mAnnotations.put(id, marker); return marker; @@ -1209,8 +1208,7 @@ public class MapboxMap { private MarkerView prepareViewMarker(BaseMarkerViewOptions markerViewOptions) { MarkerView marker = markerViewOptions.getMarker(); - Icon icon = IconFactory.recreate("markerViewSettings", mViewMarkerBitmap); - marker.setIcon(icon); + marker.setIcon(markerViewOptions.getIcon()); return marker; } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/layout/view_image_marker.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/layout/view_image_marker.xml new file mode 100644 index 0000000000..7e4a079063 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/layout/view_image_marker.xml @@ -0,0 +1,5 @@ + + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java index 65a5afa602..60ace581a4 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java @@ -1,9 +1,7 @@ package com.mapbox.mapboxsdk.testapp.activity.annotation; import android.content.Context; -import android.graphics.Point; import android.os.Bundle; -import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; @@ -17,8 +15,9 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.mapbox.mapboxsdk.annotations.Icon; +import com.mapbox.mapboxsdk.annotations.IconFactory; import com.mapbox.mapboxsdk.annotations.Marker; -import com.mapbox.mapboxsdk.annotations.MarkerView; import com.mapbox.mapboxsdk.annotations.MarkerViewManager; import com.mapbox.mapboxsdk.annotations.MarkerViewOptions; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -68,38 +67,42 @@ public class MarkerViewActivity extends AppCompatActivity { public void onMapReady(@NonNull MapboxMap mapboxMap) { mMapboxMap = mapboxMap; - // add text markers + final MarkerViewManager markerViewManager = mapboxMap.getMarkerViewManager(); + + Icon usFlag = IconFactory.getInstance(MarkerViewActivity.this) + .fromResource(R.drawable.ic_us); + + // add default ViewMarker markers for (int i = 0; i < LAT_LNGS.length; i++) { mMapboxMap.addMarker(new MarkerViewOptions() .position(LAT_LNGS[i]) .title(String.valueOf(i)) + .icon(usFlag) .selectAnimatorResource(R.animator.scale_up) .deselectAnimatorResource(R.animator.scale_down) ); } - // add flag marker + // add child classes of ViewMarker CountryMarkerViewOptions options = new CountryMarkerViewOptions(); - options.title("United States"); - options.abbrevName("us"); - options.flagRes(R.drawable.ic_us); + options.flagRes(R.drawable.icon_burned); + options.abbrevName("Mapbox"); options.position(new LatLng(38.899774, -77.023237)); options.selectAnimatorResource(R.animator.rotate_360); options.deselectAnimatorResource(R.animator.rotate_360); options.flat(true); mapboxMap.addMarker(options); - // default GL marker + // add default GL marker mMapboxMap.addMarker(new CountryMarkerOptions() .title("United States") .position(new LatLng(38.902580, -77.050102)) ); - // set adapters - final MarkerViewManager markerViewManager = mapboxMap.getMarkerViewManager(); - markerViewManager.addMarkerViewAdapter(new TextAdapter(MarkerViewActivity.this)); + // set adapters for child classes of ViewMarker markerViewManager.addMarkerViewAdapter(new CountryAdapter(MarkerViewActivity.this)); + // add a change listener to validate the size of amount of child views mMapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { @Override public void onMapChanged(@MapView.MapChange int change) { @@ -111,6 +114,7 @@ public class MarkerViewActivity extends AppCompatActivity { } }); + // add a OnMarkerView click listener mMapboxMap.getMarkerViewManager().setOnMarkerViewClickListener(new MapboxMap.OnMarkerViewClickListener() { @Override public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view, @NonNull MapboxMap.MarkerViewAdapter adapter) { @@ -122,36 +126,6 @@ public class MarkerViewActivity extends AppCompatActivity { }); } - private static class TextAdapter extends MapboxMap.MarkerViewAdapter { - - private LayoutInflater inflater; - - public TextAdapter(@NonNull Context context) { - super(context); - this.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_text_marker, parent, false); - viewHolder.title = (TextView) convertView.findViewById(R.id.textView); - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - viewHolder.title.setText(marker.getTitle()); - return convertView; - } - - private static class ViewHolder { - TextView title; - } - } - private static class CountryAdapter extends MapboxMap.MarkerViewAdapter { private LayoutInflater inflater; diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml index 08caf1df66..98050c061f 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/view_custom_marker.xml @@ -14,6 +14,8 @@ android:textColor="@android:color/white" android:layout_height="wrap_content" android:textStyle="bold" - android:layout_centerInParent="true" /> + android:layout_alignBottom="@id/imageView" + android:layout_centerHorizontal="true" + android:padding="2dp"/> \ No newline at end of file -- cgit v1.2.1