diff options
author | Tobrun Van Nuland <tobrun.van.nuland@gmail.com> | 2016-08-26 22:56:17 +0200 |
---|---|---|
committer | Tobrun Van Nuland <tobrun.van.nuland@gmail.com> | 2016-08-26 22:56:17 +0200 |
commit | eb9d99beae58cc2755015ed214f959885f705ade (patch) | |
tree | c1a4e6743c77ceeb75e7969c6bfca2dd97421218 | |
parent | 2b42f0e22f20f8a5cdedcd729fecb48835caf13d (diff) | |
download | qtlocation-mapboxgl-eb9d99beae58cc2755015ed214f959885f705ade.tar.gz |
[android] - markerview z orderingupstream/tobrun-markerview-z-ordering
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)) ); |