diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2017-12-21 14:26:53 +0100 |
---|---|---|
committer | Łukasz Paczos <lukas.paczos@gmail.com> | 2017-12-21 14:26:53 +0100 |
commit | 2e7145c1bdb98761208dda05254e081f7ae6ce26 (patch) | |
tree | 354cf1c455724bb2f61eacd6c7a95f59c5bda0b7 | |
parent | c2250e6e53fcd7eda06250394bbda72c580e0c09 (diff) | |
download | qtlocation-mapboxgl-2e7145c1bdb98761208dda05254e081f7ae6ce26.tar.gz |
[android] [WIP] testing symbol layer for InfoWindow
4 files changed, 133 insertions, 2 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java index 9f256c341b..77f27a4fb1 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AnnotationManager.java @@ -83,6 +83,7 @@ class AnnotationManager { AnnotationManager bind(MapboxMap mapboxMap) { this.mapboxMap = mapboxMap; this.markerViewManager.bind(mapboxMap); + this.infoWindowManager.bind(mapboxMap); return this; } @@ -170,11 +171,15 @@ class AnnotationManager { // Marker addMarker(@NonNull BaseMarkerOptions markerOptions, @NonNull MapboxMap mapboxMap) { - return markers.addBy(markerOptions, mapboxMap); + Marker marker = markers.addBy(markerOptions, mapboxMap); + infoWindowManager.addMarker(mapView, marker); + return marker; } List<Marker> addMarkers(@NonNull List<? extends BaseMarkerOptions> markerOptionsList, @NonNull MapboxMap mapboxMap) { - return markers.addBy(markerOptionsList, mapboxMap); + List<Marker> markerList = markers.addBy(markerOptionsList, mapboxMap); + infoWindowManager.addMarkers(mapView, markerList); + return markerList; } void updateMarker(@NonNull Marker updatedMarker, @NonNull MapboxMap mapboxMap) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java index af207204d9..c2b2c3e54f 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/InfoWindowManager.java @@ -1,12 +1,26 @@ package com.mapbox.mapboxsdk.maps; +import android.content.Context; +import android.graphics.Bitmap; import android.support.annotation.Nullable; import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.annotations.InfoWindow; import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.style.layers.Filter; +import com.mapbox.mapboxsdk.style.layers.PropertyFactory; +import com.mapbox.mapboxsdk.style.layers.SymbolLayer; +import com.mapbox.mapboxsdk.style.sources.GeoJsonSource; +import com.mapbox.mapboxsdk.utils.BitmapUtils; +import com.mapbox.services.commons.geojson.Feature; +import com.mapbox.services.commons.geojson.FeatureCollection; +import com.mapbox.services.commons.geojson.Point; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; /** @@ -20,8 +34,19 @@ import java.util.List; * </p> */ class InfoWindowManager { + private static final String SOURCE_ID = "info.window.source"; + private static final String LAYER_ID = "info.window.layer"; + private static final String PROPERTY_SELECTED = "info.window.property.selected"; + private static final String PROPERTY_ID = "info.window.property.ID"; + + private GeoJsonSource infoWindowsSource; + private SymbolLayer infoWindowsLayer; + + private MapboxMap mapboxMap; private final List<InfoWindow> infoWindows = new ArrayList<>(); + private final HashMap<Long, Marker> markerHashMap = new HashMap<>(); + private final FeatureCollection featureCollection = FeatureCollection.fromFeatures(new ArrayList<Feature>()); private MapboxMap.InfoWindowAdapter infoWindowAdapter; private boolean allowConcurrentMultipleInfoWindows; @@ -30,6 +55,21 @@ class InfoWindowManager { private MapboxMap.OnInfoWindowLongClickListener onInfoWindowLongClickListener; private MapboxMap.OnInfoWindowCloseListener onInfoWindowCloseListener; + void bind(MapboxMap mapboxMap) { + this.mapboxMap = mapboxMap; + initialise(); + } + + private void initialise() { + infoWindowsSource = new GeoJsonSource(SOURCE_ID); + mapboxMap.addSource(infoWindowsSource); + + infoWindowsLayer = new SymbolLayer(LAYER_ID, SOURCE_ID) + .withProperties(PropertyFactory.iconImage("{" + PROPERTY_ID + "}")) + .withFilter(Filter.eq(PROPERTY_SELECTED, true)); + mapboxMap.addLayer(infoWindowsLayer); + } + void update() { if (!infoWindows.isEmpty()) { for (InfoWindow infoWindow : infoWindows) { @@ -82,7 +122,62 @@ class InfoWindowManager { return onInfoWindowCloseListener; } + void addMarker(MapView mapView, Marker marker) { + invalidateWindow(mapView, marker); + addNewFeature(marker); + refreshSource(); + } + + void invalidateWindows(MapView mapView) { + for (Marker marker : markerHashMap.values()) { + invalidateWindow(mapView, marker); + } + } + + private void invalidateWindow(MapView mapView, Marker marker) { + LayoutInflater layoutInflater = LayoutInflater.from(mapView.getContext()); + View view; + if (infoWindowAdapter == null) { + view = layoutInflater.inflate(R.layout.mapbox_infowindow_content, mapView, false); + } else { + view = infoWindowAdapter.getInfoWindow(marker); + } + markerHashMap.put(marker.getId(), marker); + + if (view != null) { + Bitmap bitmap = BitmapUtils.generate(view); + mapboxMap.addImage(String.valueOf(marker.getId()), bitmap); + } + } + + void addMarkers(MapView mapView, List<Marker> markers) { + for (Marker marker : markers) { + invalidateWindow(mapView, marker); + addNewFeature(marker); + } + refreshSource(); + } + + void removeMarker(Context context, Marker marker) { + + } + public void add(InfoWindow infoWindow) { infoWindows.add(infoWindow); } + + private void addNewFeature(Marker marker) { + Feature feature = Feature.fromGeometry( + Point.fromCoordinates( + new double[] {marker.getPosition().getLongitude(), marker.getPosition().getLatitude()} + ) + ); + feature.addNumberProperty(PROPERTY_ID, marker.getId()); + feature.addBooleanProperty(PROPERTY_SELECTED, true); + featureCollection.getFeatures().add(feature); + } + + private void refreshSource() { + infoWindowsSource.setGeoJson(featureCollection); + } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java index 78503f9dfe..f329e48eac 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/BitmapUtils.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; @@ -117,4 +118,25 @@ public class BitmapUtils { return new BitmapDrawable(context.getResources(), compass); } + /** + * Generate a Bitmap from an Android SDK View. + * + * @param view the View to be drawn to a Bitmap + * @return the generated bitmap + */ + public static Bitmap generate(@NonNull View view) { + int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + view.measure(measureSpec, measureSpec); + + int measuredWidth = view.getMeasuredWidth(); + int measuredHeight = view.getMeasuredHeight(); + + view.layout(0, 0, measuredWidth, measuredHeight); + Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888); + bitmap.eraseColor(Color.TRANSPARENT); + Canvas canvas = new Canvas(bitmap); + view.draw(canvas); + return bitmap; + } + } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java index d8dea0e3b5..18a98ad4c3 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/infowindow/InfoWindowAdapterActivity.java @@ -34,6 +34,15 @@ public class InfoWindowAdapterActivity extends AppCompatActivity { mapView.onCreate(savedInstanceState); mapView.getMapAsync(map -> { mapboxMap = map; + mapboxMap.setAllowConcurrentMultipleOpenInfoWindows(true); + mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() { + @Override + public void onMapClick(@NonNull LatLng point) { + for (Marker marker : mapboxMap.getMarkers()) { + marker.setTitle("bladslfbladb"); + } + } + }); addMarkers(); addCustomInfoWindowAdapter(); }); |