From eb9d99beae58cc2755015ed214f959885f705ade Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Fri, 26 Aug 2016 22:56:17 +0200 Subject: [android] - markerview z ordering --- .../annotations/BaseMarkerViewOptions.java | 21 ++++++ .../mapbox/mapboxsdk/annotations/MarkerView.java | 30 ++++++-- .../mapboxsdk/annotations/MarkerViewManager.java | 17 ++++- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 15 +--- .../mapboxsdk/maps/widgets/MarkerViewLayout.java | 85 ++++++++++++++++++++++ .../src/main/res/layout/mapview_internal.xml | 4 +- .../activity/annotation/MarkerViewActivity.java | 4 + 7 files changed, 152 insertions(+), 24 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MarkerViewLayout.java 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 a5c6397b6f..20f111d0d7 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 @@ -30,6 +30,7 @@ public abstract class BaseMarkerViewOptions other.getzIndex()) { + return -1; + } + } + return super.compareTo(annotation); + } } 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 9631bc4ca8..ea0883472a 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 @@ -15,13 +15,17 @@ import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.Projection; +import com.mapbox.mapboxsdk.maps.widgets.MarkerViewLayout; import com.mapbox.mapboxsdk.utils.AnimatorUtils; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeMap; /** * Interface for interacting with ViewMarkers objects inside of a MapView. @@ -31,7 +35,8 @@ import java.util.Map; */ public class MarkerViewManager { - private Map markerViewMap; + private MarkerViewLayout layout; + private HashMap markerViewMap; private MapboxMap mapboxMap; private MapView mapView; private List markerViewAdapters; @@ -47,8 +52,10 @@ public class MarkerViewManager { */ public MarkerViewManager(@NonNull MapboxMap mapboxMap, @NonNull MapView mapView) { this.mapboxMap = mapboxMap; - this.markerViewAdapters = new ArrayList<>(); this.mapView = mapView; + this.layout = (MarkerViewLayout) mapView.findViewById(R.id.markerViewLayout); + this.layout.setMarkerViewManager(this); + this.markerViewAdapters = new ArrayList<>(); this.markerViewMap = new HashMap<>(); this.defaultMarkerViewAdapter = new ImageMarkerViewAdapter(mapView.getContext()); this.markerViewAdapters.add(defaultMarkerViewAdapter); @@ -438,7 +445,7 @@ public class MarkerViewManager { markerViewMap.put(marker, adaptedView); if (convertView == null) { adaptedView.setVisibility(View.GONE); - mapView.getMarkerViewContainer().addView(adaptedView); + layout.addView(adaptedView); } } } @@ -486,6 +493,10 @@ public class MarkerViewManager { } } + public HashMap getMarkers() { + return markerViewMap; + } + /** * Default MarkerViewAdapter used for base class of MarkerView to adapt a MarkerView to an ImageView */ 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 3cb28ed395..1f82c570c5 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 @@ -123,7 +123,6 @@ public class MapView extends FrameLayout { private NativeMapView mNativeMapView; private boolean mHasSurface = false; - private ViewGroup mMarkerViewContainer; private CompassView mCompassView; private ImageView mLogoView; private ImageView mAttributionsView; @@ -193,11 +192,12 @@ public class MapView extends FrameLayout { mInitialLoad = true; mOnMapReadyCallbackList = new ArrayList<>(); mOnMapChangedListener = new CopyOnWriteArrayList<>(); - mMapboxMap = new MapboxMap(this); mIcons = new ArrayList<>(); View view = LayoutInflater.from(context).inflate(R.layout.mapview_internal, this); setWillNotDraw(false); + mMapboxMap = new MapboxMap(this); + // Reference the TextureView SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.surfaceView); @@ -226,9 +226,6 @@ public class MapView extends FrameLayout { // Connectivity onConnectivityChanged(isConnected()); - - mMarkerViewContainer = (ViewGroup) view.findViewById(R.id.markerViewContainer); - mMyLocationView = (MyLocationView) view.findViewById(R.id.userLocationView); mMyLocationView.setMapboxMap(mMapboxMap); @@ -1200,14 +1197,6 @@ public class MapView extends FrameLayout { return new ArrayList<>(annotations); } - /** - * @return the ViewGroup containing the marker views - */ - public ViewGroup getMarkerViewContainer() { - return mMarkerViewContainer; - } - - int getTopOffsetPixelsForIcon(Icon icon) { if (mDestroyed) { return 0; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MarkerViewLayout.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MarkerViewLayout.java new file mode 100644 index 0000000000..7f07f30ff9 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MarkerViewLayout.java @@ -0,0 +1,85 @@ +package com.mapbox.mapboxsdk.maps.widgets; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.FrameLayout; + +import com.mapbox.mapboxsdk.annotations.MarkerView; +import com.mapbox.mapboxsdk.annotations.MarkerViewManager; +import com.mapbox.mapboxsdk.constants.MapboxConstants; + +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +public class MarkerViewLayout extends FrameLayout { + + private MarkerViewManager markerViewManager; + + public MarkerViewLayout(Context context) { + super(context); + init(); + } + + public MarkerViewLayout(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public MarkerViewLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public MarkerViewLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(); + } + + private void init() { + setChildrenDrawingOrderEnabled(true); + } + + public void setMarkerViewManager(MarkerViewManager markerViewManager) { + this.markerViewManager = markerViewManager; + } + + @Override + protected int getChildDrawingOrder(int childCount, int index) { + if (markerViewManager != null) { + HashMap markerViewMap = markerViewManager.getMarkers(); + + assert markerViewMap.keySet().size() == childCount; + + Iterator iterator = markerViewMap.keySet().iterator(); + while (iterator.hasNext()) { + MarkerView markerView = iterator.next(); + Log.v(MapboxConstants.TAG, "Z index markers" + markerView.getzIndex()+ "MarkerView get class "+markerView.getClass().getSimpleName()); + } + Log.e(MapboxConstants.TAG, "-------------------------"); + TreeMap sortedMarkerViewMap = new TreeMap<>(markerViewMap); + Iterator iteratorSorted = sortedMarkerViewMap.keySet().iterator(); + + while (iteratorSorted.hasNext()) { + MarkerView markerView = iteratorSorted.next(); + Log.v(MapboxConstants.TAG, "Z index markers" + markerView.getzIndex()+ "MarkerView get class "+markerView.getClass().getSimpleName()); + } + + Log.v(MapboxConstants.TAG, "getChildDrawingOrder: childcount " + childCount + "- index " + "i"); + Log.v(MapboxConstants.TAG, "getChildDrawingOrder: childcount " + markerViewManager.getMarkers() + "- index " + "i"); + + // TODO insert correct index + return index; + } + return index; + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/layout/mapview_internal.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/layout/mapview_internal.xml index 1a9d1fc7bb..df0060b3d2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/layout/mapview_internal.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/layout/mapview_internal.xml @@ -6,8 +6,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> - 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 ce86a78099..b62aa5c682 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 @@ -103,6 +103,7 @@ public class MarkerViewActivity extends AppCompatActivity { options.title("Hello"); options.position(new LatLng(38.899774, -77.023237)); options.flat(true); + options.zIndex(20); mapboxMap.addMarker(options); MarkerViewActivity.this.mapboxMap.addMarker(new MarkerOptions() @@ -113,15 +114,18 @@ public class MarkerViewActivity extends AppCompatActivity { MarkerViewActivity.this.mapboxMap.addMarker(new TextMarkerViewOptions() .text("A") .position(new LatLng(38.889876, -77.008849)) + .zIndex(0) ); MarkerViewActivity.this.mapboxMap.addMarker(new TextMarkerViewOptions() .text("B") .position(new LatLng(38.907327, -77.041293)) + .zIndex(1) ); MarkerViewActivity.this.mapboxMap.addMarker(new TextMarkerViewOptions() .text("C") + .zIndex(2) .position(new LatLng(38.897642, -77.041980)) ); -- cgit v1.2.1