summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobrun Van Nuland <tobrun.van.nuland@gmail.com>2016-08-26 22:56:17 +0200
committerTobrun Van Nuland <tobrun.van.nuland@gmail.com>2016-08-26 22:56:17 +0200
commiteb9d99beae58cc2755015ed214f959885f705ade (patch)
treec1a4e6743c77ceeb75e7969c6bfca2dd97421218
parent2b42f0e22f20f8a5cdedcd729fecb48835caf13d (diff)
downloadqtlocation-mapboxgl-upstream/tobrun-markerview-z-ordering.tar.gz
[android] - markerview z orderingupstream/tobrun-markerview-z-ordering
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java21
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java30
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java17
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java15
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MarkerViewLayout.java85
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/res/layout/mapview_internal.xml4
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java4
7 files changed, 152 insertions, 24 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/BaseMarkerViewOptions.java
index 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<U extends MarkerView, T extends Base
protected boolean visible = true;
protected boolean selected;
protected float alpha = 1.0f;
+ public float zIndex;
/**
* Default constructor
@@ -152,6 +153,17 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base
}
/**
+ * Set the z index of the MarkerView.
+ *
+ * @param zIndex the z index value
+ * @return the object for which the method was called
+ */
+ public T zIndex(float zIndex){
+ this.zIndex = zIndex;
+ return getThis();
+ }
+
+ /**
* Get the geographical location of the MarkerView.
*
* @return the geographical location
@@ -260,6 +272,14 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base
}
/**
+ * Get the zIndex of the MarkerView
+ * @return the z index value
+ */
+ public float getzIndex() {
+ return zIndex;
+ }
+
+ /**
* Get the instance of the object for which this method was called.
*
* @return the object for which the this method was called
@@ -272,4 +292,5 @@ public abstract class BaseMarkerViewOptions<U extends MarkerView, T extends Base
* @return the MarkerView created from this builder
*/
public abstract U getMarker();
+
}
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 a577550635..2ece47eb74 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java
@@ -1,18 +1,13 @@
package com.mapbox.mapboxsdk.annotations;
-import android.animation.AnimatorSet;
import android.graphics.Bitmap;
-import android.graphics.PointF;
import android.support.annotation.FloatRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.view.View;
-import android.view.animation.AnimationUtils;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.utils.AnimatorUtils;
/**
* MarkerView is an annotation that shows an View at a geographical location.
@@ -39,6 +34,7 @@ public class MarkerView extends Marker {
private boolean flat;
private boolean visible = true;
+ private float zIndex;
private float tiltValue;
private float rotation;
@@ -71,6 +67,7 @@ public class MarkerView extends Marker {
this.anchorU = baseMarkerViewOptions.anchorU;
this.anchorV = baseMarkerViewOptions.anchorV;
this.selected = baseMarkerViewOptions.selected;
+ this.zIndex = baseMarkerViewOptions.zIndex;
}
/**
@@ -312,6 +309,14 @@ public class MarkerView extends Marker {
return selected;
}
+ public float getzIndex() {
+ return zIndex;
+ }
+
+ public void setzIndex(float zIndex) {
+ this.zIndex = zIndex;
+ }
+
/**
* For internal use only, use {@link MapboxMap#selectMarker(Marker)} instead.
*/
@@ -341,7 +346,7 @@ public class MarkerView extends Marker {
public void setMapboxMap(MapboxMap mapboxMap) {
super.setMapboxMap(mapboxMap);
- if(isFlat()) {
+ if (isFlat()) {
// initial tilt value if MapboxMap is started with a tilt attribute
tiltValue = (float) mapboxMap.getCameraPosition().tilt;
}
@@ -358,4 +363,17 @@ public class MarkerView extends Marker {
public String toString() {
return "MarkerView [position[" + getPosition() + "]]";
}
+
+ @Override
+ public int compareTo(@NonNull Annotation annotation) {
+ if (annotation instanceof MarkerView) {
+ MarkerView other = (MarkerView) annotation;
+ if (zIndex < other.getzIndex()) {
+ return 1;
+ } else if (zIndex > 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<MarkerView, View> markerViewMap;
+ private MarkerViewLayout layout;
+ private HashMap<MarkerView, View> markerViewMap;
private MapboxMap mapboxMap;
private MapView mapView;
private List<MapboxMap.MarkerViewAdapter> 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<MarkerView,View> 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<MarkerView,View> markerViewMap = markerViewManager.getMarkers();
+
+ assert markerViewMap.keySet().size() == childCount;
+
+ Iterator<MarkerView> 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<MarkerView, View> sortedMarkerViewMap = new TreeMap<>(markerViewMap);
+ Iterator<MarkerView> 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" />
- <FrameLayout
- android:id="@+id/markerViewContainer"
+ <com.mapbox.mapboxsdk.maps.widgets.MarkerViewLayout
+ android:id="@+id/markerViewLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent" />
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))
);