From 5933ab2de719aa3238f3b3329e16c87bff820898 Mon Sep 17 00:00:00 2001 From: Langston Smith Date: Fri, 29 Mar 2019 09:58:05 -0700 Subject: [PATCH 1/8] Adding ClickToAddImageActivity example to MainActivity (#923) * additions * added null check --- .../java/com/mapbox/mapboxandroiddemo/MainActivity.java | 8 ++++++++ .../examples/labs/MarkerFollowingRouteActivity.java | 1 - .../examples/styles/ClickToAddImageActivity.java | 7 +++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java index c064e9f12..bf48e18f5 100644 --- a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java +++ b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java @@ -556,6 +556,14 @@ private void initializeModels() { null, R.string.activity_style_image_source_url, false, BuildConfig.MIN_SDK_VERSION )); + exampleItemModels.add(new ExampleItemModel( + R.id.nav_styles, + R.string.activity_styles_click_to_add_image_title, + R.string.activity_styles_click_to_add_image_description, + new Intent(MainActivity.this, ClickToAddImageActivity.class), + null, + R.string.activity_styles_click_to_add_image_url, false, BuildConfig.MIN_SDK_VERSION + )); exampleItemModels.add(new ExampleItemModel( R.id.nav_styles, R.string.activity_style_image_source_time_lapse_title, diff --git a/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/labs/MarkerFollowingRouteActivity.java b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/labs/MarkerFollowingRouteActivity.java index a5e31e2c6..4d694bf78 100644 --- a/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/labs/MarkerFollowingRouteActivity.java +++ b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/labs/MarkerFollowingRouteActivity.java @@ -127,7 +127,6 @@ public void run() { markerIconCurrentLocation = (LatLng) markerIconAnimator.getAnimatedValue(); markerIconAnimator.cancel(); } - if (latLngEvaluator != null) { markerIconAnimator = ObjectAnimator .ofObject(latLngEvaluator, count == 0 ? new LatLng(37.61501, -122.385374) diff --git a/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/styles/ClickToAddImageActivity.java b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/styles/ClickToAddImageActivity.java index 5d6f636b7..310f1fa90 100644 --- a/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/styles/ClickToAddImageActivity.java +++ b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/styles/ClickToAddImageActivity.java @@ -47,12 +47,12 @@ public class ClickToAddImageActivity extends AppCompatActivity implements private static final String ID_IMAGE_SOURCE = "source-id"; private static final String CIRCLE_SOURCE_ID = "circle-source-id"; private static final String ID_IMAGE_LAYER = "layer-id"; + private static int PHOTO_PICK_CODE = 4; private MapView mapView; private MapboxMap mapboxMap; private LatLngQuad quad; private List boundsFeatureList; private List boundsCirclePointList; - private static int PHOTO_PICK_CODE = 4; private int imageCountIndex; @Override @@ -99,7 +99,7 @@ public boolean onMapClick(@NonNull LatLng point) { boundsFeatureList.add(Feature.fromGeometry(Point.fromLngLat(point.getLongitude(), point.getLatitude()))); - // Add the click point to the circle layer and update the display of the circle layer data + // Add the click point to the CircleLayer and update the display of the CircleLayer data boundsCirclePointList.add(Point.fromLngLat(point.getLongitude(), point.getLatitude())); Style style = mapboxMap.getStyle(); @@ -130,7 +130,6 @@ public boolean onMapClick(@NonNull LatLng point) { pickPhotoIntent.setType("image/*"); startActivityForResult(pickPhotoIntent, PHOTO_PICK_CODE); } - return true; } @@ -172,7 +171,7 @@ public void onActivityResult(int requestCode, int resultCode, final Intent data) @Override public void onStyleLoaded(@NonNull Style style) { Uri selectedImage = data.getData(); - InputStream imageStream = null; + InputStream imageStream; try { imageStream = getContentResolver().openInputStream(selectedImage); From c7f4d90e4941757ebd5fb7937cc9f8f529626f07 Mon Sep 17 00:00:00 2001 From: Langston Smith Date: Fri, 29 Mar 2019 10:55:01 -0700 Subject: [PATCH 2/8] Symbol switch based on zoom level example (#929) * initial additions * refactoring based on tobrun review --- .../mapboxandroiddemo/MainActivity.java | 9 + .../src/main/AndroidManifest.xml | 7 + .../dds/SymbolSwitchOnZoomActivity.java | 158 ++++++++++++++++++ .../main/res/drawable-anydpi/ic_person.xml | 9 + .../activity_zoom_based_icon_switch.xml | 18 ++ .../src/main/res/values/activity_strings.xml | 4 + .../main/res/values/descriptions_strings.xml | 1 + .../src/main/res/values/titles_strings.xml | 1 + .../src/main/res/values/urls_strings.xml | 1 + 9 files changed, 208 insertions(+) create mode 100644 MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/dds/SymbolSwitchOnZoomActivity.java create mode 100644 MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_person.xml create mode 100644 MapboxAndroidDemo/src/main/res/layout/activity_zoom_based_icon_switch.xml diff --git a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java index bf48e18f5..992630d3b 100644 --- a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java +++ b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java @@ -57,6 +57,7 @@ import com.mapbox.mapboxandroiddemo.examples.dds.SatelliteLandSelectActivity; import com.mapbox.mapboxandroiddemo.examples.dds.StyleCirclesCategoricallyActivity; import com.mapbox.mapboxandroiddemo.examples.dds.StyleLineIdentityPropertyActivity; +import com.mapbox.mapboxandroiddemo.examples.dds.SymbolSwitchOnZoomActivity; import com.mapbox.mapboxandroiddemo.examples.extrusions.AdjustExtrusionLightActivity; import com.mapbox.mapboxandroiddemo.examples.extrusions.Indoor3DMapActivity; import com.mapbox.mapboxandroiddemo.examples.extrusions.MarathonExtrusionActivity; @@ -1214,6 +1215,14 @@ private void initializeModels() { null, R.string.activity_dds_satellite_land_select_url, true, BuildConfig.MIN_SDK_VERSION)); + exampleItemModels.add(new ExampleItemModel( + R.id.nav_dds, + R.string.activity_dds_symbol_zoom_switch_title, + R.string.activity_dds_symbol_zoom_switch_description, + new Intent(MainActivity.this, SymbolSwitchOnZoomActivity.class), + null, + R.string.activity_dds_symbol_zoom_switch_url, true, BuildConfig.MIN_SDK_VERSION)); + exampleItemModels.add(new ExampleItemModel( R.id.nav_basics, R.string.activity_basic_simple_mapview_title, diff --git a/MapboxAndroidDemo/src/main/AndroidManifest.xml b/MapboxAndroidDemo/src/main/AndroidManifest.xml index b60285a4f..4939a7d45 100644 --- a/MapboxAndroidDemo/src/main/AndroidManifest.xml +++ b/MapboxAndroidDemo/src/main/AndroidManifest.xml @@ -628,6 +628,13 @@ android:name="android.support.PARENT_ACTIVITY" android:value="com.mapbox.mapboxandroiddemo.MainActivity" /> + + + diff --git a/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/dds/SymbolSwitchOnZoomActivity.java b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/dds/SymbolSwitchOnZoomActivity.java new file mode 100644 index 000000000..fccd820c6 --- /dev/null +++ b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/dds/SymbolSwitchOnZoomActivity.java @@ -0,0 +1,158 @@ +package com.mapbox.mapboxandroiddemo.examples.dds; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.widget.Toast; + +import com.mapbox.geojson.Feature; +import com.mapbox.geojson.FeatureCollection; +import com.mapbox.geojson.Point; +import com.mapbox.mapboxandroiddemo.R; +import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.mapbox.mapboxsdk.maps.Style; +import com.mapbox.mapboxsdk.style.layers.SymbolLayer; +import com.mapbox.mapboxsdk.style.sources.GeoJsonSource; +import com.mapbox.mapboxsdk.utils.BitmapUtils; + +import static com.mapbox.mapboxsdk.style.expressions.Expression.literal; +import static com.mapbox.mapboxsdk.style.expressions.Expression.step; +import static com.mapbox.mapboxsdk.style.expressions.Expression.stop; +import static com.mapbox.mapboxsdk.style.expressions.Expression.zoom; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconAllowOverlap; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconIgnorePlacement; +import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconImage; + +/** + * Use the SymbolLayer's setMinZoom and setMaxZoom methods to create the effect of SymbolLayer icons switching + * based on the map camera's zoom level. + */ +public class SymbolSwitchOnZoomActivity extends AppCompatActivity implements OnMapReadyCallback { + + private static final float ZOOM_LEVEL_FOR_SWITCH = 12; + private static final String BLUE_PERSON_ICON_ID = "blue-car-icon-marker-icon-id"; + private static final String BLUE_PIN_ICON_ID = "blue-marker-icon-marker-icon-id"; + private MapView mapView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Mapbox access token is configured here. This needs to be called either in your application + // object or in the same activity which contains the mapview. + Mapbox.getInstance(this, getString(R.string.access_token)); + + // This contains the MapView in XML and needs to be called after the access token is configured. + setContentView(R.layout.activity_zoom_based_icon_switch); + + mapView = findViewById(R.id.mapView); + mapView.onCreate(savedInstanceState); + mapView.getMapAsync(this); + } + + @Override + public void onMapReady(final MapboxMap mapboxMap) { + + mapboxMap.setStyle(new Style.Builder().fromUrl(Style.OUTDOORS) + + // Add images to the map so that the SymbolLayers can reference the images. + .withImage(BLUE_PERSON_ICON_ID, BitmapUtils.getBitmapFromDrawable( + getResources().getDrawable(R.drawable.ic_person))) + .withImage(BLUE_PIN_ICON_ID, BitmapUtils.getBitmapFromDrawable( + getResources().getDrawable(R.drawable.blue_marker))) + + // Add random data to the GeoJsonSource and then add the GeoJsonSource to the map + .withSource(new GeoJsonSource("source-id", + FeatureCollection.fromFeatures(new Feature[] { + Feature.fromGeometry(Point.fromLngLat( + 9.205394983291626, + 45.47661043757903)), + Feature.fromGeometry(Point.fromLngLat( + 9.223880767822266, + 45.47623240235297)), + Feature.fromGeometry(Point.fromLngLat( + 9.15530204772949, + 45.4706650227671)), + Feature.fromGeometry(Point.fromLngLat( + 9.153714179992676, + 45.48625229963004)), + Feature.fromGeometry(Point.fromLngLat( + 9.158306121826172, + 45.482731998239636)), + Feature.fromGeometry(Point.fromLngLat( + 9.188523888587952, + 45.4923746929562)), + Feature.fromGeometry(Point.fromLngLat( + 9.20929491519928, + 45.45314676076135)), + Feature.fromGeometry(Point.fromLngLat( + 9.177778959274292, + 45.45569808340158)) + }) + )), new Style.OnStyleLoaded() { + @Override + public void onStyleLoaded(@NonNull Style style) { + + // Create a SymbolLayer and use the {@link com.mapbox.mapboxsdk.style.expressions.Expression.step()} + // to adjust the SymbolLayer icon based on the zoom level. The blue person icon is set as the default + // icon and then a step is used to switch to the blue person icon at a certain map camera zoom level. + SymbolLayer singleLayer = new SymbolLayer("symbol-layer-id", "source-id"); + singleLayer.setProperties( + iconImage(step(zoom(), literal(BLUE_PERSON_ICON_ID), + stop(ZOOM_LEVEL_FOR_SWITCH, BLUE_PIN_ICON_ID))), + iconIgnorePlacement(true), + iconAllowOverlap(true)); + style.addLayer(singleLayer); + + Toast.makeText(SymbolSwitchOnZoomActivity.this, + R.string.zoom_map_in_and_out_icon_switch_instruction, Toast.LENGTH_SHORT).show(); + } + } + ); + } + + @Override + public void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + public void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapView.onLowMemory(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mapView.onSaveInstanceState(outState); + } +} diff --git a/MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_person.xml b/MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_person.xml new file mode 100644 index 000000000..da856bb02 --- /dev/null +++ b/MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_person.xml @@ -0,0 +1,9 @@ + + + diff --git a/MapboxAndroidDemo/src/main/res/layout/activity_zoom_based_icon_switch.xml b/MapboxAndroidDemo/src/main/res/layout/activity_zoom_based_icon_switch.xml new file mode 100644 index 000000000..f5af6f3a3 --- /dev/null +++ b/MapboxAndroidDemo/src/main/res/layout/activity_zoom_based_icon_switch.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/values/activity_strings.xml b/MapboxAndroidDemo/src/main/res/values/activity_strings.xml index d7ea66b80..b5ed0888f 100644 --- a/MapboxAndroidDemo/src/main/res/values/activity_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/activity_strings.xml @@ -308,4 +308,8 @@ Light azimuthal angle Light polar angle Building opacity + + + Zoom in and out to see the icons change + \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml b/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml index 923f72164..ada0aa077 100644 --- a/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml @@ -51,6 +51,7 @@ Use SymbolLayer and icons to show data in a BubbleLayout "info window". Use multiple expressions to visualize unit change in data. View satellite photos and click to outline an area of land. + Change SymbolLayer icons based on the camera\'s zoom level. Create a default marker with an InfoWindow. Draw a polyline by parsing a GeoJSON file with the Mapbox Maps SDK. Draw a vector polygon on a map with the Mapbox Maps SDK. diff --git a/MapboxAndroidDemo/src/main/res/values/titles_strings.xml b/MapboxAndroidDemo/src/main/res/values/titles_strings.xml index 3f1480001..a2f755ff2 100644 --- a/MapboxAndroidDemo/src/main/res/values/titles_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/titles_strings.xml @@ -51,6 +51,7 @@ Temperature change Satellite land select Line gradient + Zoom-based icon switch Draw a marker Draw a GeoJSON line Draw a polygon diff --git a/MapboxAndroidDemo/src/main/res/values/urls_strings.xml b/MapboxAndroidDemo/src/main/res/values/urls_strings.xml index 77dad4635..110512522 100644 --- a/MapboxAndroidDemo/src/main/res/values/urls_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/urls_strings.xml @@ -50,6 +50,7 @@ https://i.imgur.com/KjgNcS0.png https://imgur.com/YiBeH0I.png https://i.imgur.com/tfbO1m4.png + https://i.imgur.com/sbWU4Ui.png http://i.imgur.com/X59UoaY.png https://i.imgur.com/Bs0X98z.png http://i.imgur.com/v9X28id.png From 395660e0479416cf4df8bd5f574da8f172991e2f Mon Sep 17 00:00:00 2001 From: tobrun Date: Mon, 25 Mar 2019 19:05:40 +0100 Subject: [PATCH 3/8] Update Maps SDK dependency to 7.3.0 --- build.gradle | 1 + gradle/dependencies.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7764c5414..5f4701372 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ allprojects { maven { url "https://jitpack.io" } maven { url "http://oss.sonatype.org/content/repositories/snapshots/" } jcenter() + maven { url 'https://oss.jfrog.org/artifactory/oss-snapshot-local/' } } } diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 326ac09e9..8a92b8bec 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -10,7 +10,7 @@ ext { version = [ // Mapbox - mapboxMapSdk : '7.2.0', + mapboxMapSdk : '7.3.0', mapboxTurf : '4.5.0', mapboxServices : '4.5.0', mapboxPluginBuilding : '0.5.0', From 38f636b4dc4dae25f9d34e2fcdfb41f8c9a8d6e4 Mon Sep 17 00:00:00 2001 From: Langston Smith Date: Mon, 1 Apr 2019 09:51:59 -0700 Subject: [PATCH 4/8] Adding rotating camera example (#933) * initial additions * added null check and changed to moveCamera() --- .../mapboxandroiddemo/MainActivity.java | 9 + .../src/main/AndroidManifest.xml | 7 + .../camera/SlowlyRotatingCameraActivity.java | 154 ++++++++++++++++++ .../res/layout/activity_camera_slow_spin.xml | 19 +++ .../src/main/res/values/activity_strings.xml | 3 + .../main/res/values/descriptions_strings.xml | 1 + .../src/main/res/values/titles_strings.xml | 1 + .../src/main/res/values/urls_strings.xml | 1 + 8 files changed, 195 insertions(+) create mode 100644 MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/camera/SlowlyRotatingCameraActivity.java create mode 100644 MapboxAndroidDemo/src/main/res/layout/activity_camera_slow_spin.xml diff --git a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java index 992630d3b..3c3fea652 100644 --- a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java +++ b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java @@ -37,6 +37,7 @@ import com.mapbox.mapboxandroiddemo.examples.camera.AnimateMapCameraActivity; import com.mapbox.mapboxandroiddemo.examples.camera.BoundingBoxCameraActivity; import com.mapbox.mapboxandroiddemo.examples.camera.RestrictCameraActivity; +import com.mapbox.mapboxandroiddemo.examples.camera.SlowlyRotatingCameraActivity; import com.mapbox.mapboxandroiddemo.examples.dds.AddRainFallStyleActivity; import com.mapbox.mapboxandroiddemo.examples.dds.BathymetryActivity; import com.mapbox.mapboxandroiddemo.examples.dds.ChoroplethJsonVectorMixActivity; @@ -767,6 +768,14 @@ private void initializeModels() { null, R.string.activity_camera_restrict_url, false, BuildConfig.MIN_SDK_VERSION)); + exampleItemModels.add(new ExampleItemModel( + R.id.nav_camera, + R.string.activity_camera_slowly_rotating_title, + R.string.activity_camera_slowly_rotating_description, + new Intent(MainActivity.this, SlowlyRotatingCameraActivity.class), + null, + R.string.activity_camera_slowly_rotating_url, false, BuildConfig.MIN_SDK_VERSION)); + exampleItemModels.add(new ExampleItemModel( R.id.nav_offline, R.string.activity_offline_simple_title, diff --git a/MapboxAndroidDemo/src/main/AndroidManifest.xml b/MapboxAndroidDemo/src/main/AndroidManifest.xml index 4939a7d45..7fc55f9bb 100644 --- a/MapboxAndroidDemo/src/main/AndroidManifest.xml +++ b/MapboxAndroidDemo/src/main/AndroidManifest.xml @@ -642,6 +642,13 @@ android:name="android.support.PARENT_ACTIVITY" android:value="com.mapbox.mapboxandroiddemo.MainActivity" /> + + + diff --git a/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/camera/SlowlyRotatingCameraActivity.java b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/camera/SlowlyRotatingCameraActivity.java new file mode 100644 index 000000000..729d51b17 --- /dev/null +++ b/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/camera/SlowlyRotatingCameraActivity.java @@ -0,0 +1,154 @@ +package com.mapbox.mapboxandroiddemo.examples.camera; + +import android.animation.ValueAnimator; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.view.animation.LinearInterpolator; +import android.widget.Toast; + +import com.mapbox.mapboxandroiddemo.R; +import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.mapbox.mapboxsdk.maps.Style; + +/** + * Animate the map's camera to slowly spin around a single point ont the map. + */ +public class SlowlyRotatingCameraActivity extends AppCompatActivity implements OnMapReadyCallback, + MapboxMap.OnMapClickListener { + + private static final int DESIRED_NUM_OF_SPINS = 5; + private static final int DESIRED_SECONDS_PER_ONE_FULL_360_SPIN = 40; + private MapView mapView; + private MapboxMap mapboxMap; + private ValueAnimator animator; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Mapbox access token is configured here. This needs to be called either in your application + // object or in the same activity which contains the mapview. + Mapbox.getInstance(this, getString(R.string.access_token)); + + // This contains the MapView in XML and needs to be called after the access token is configured. + setContentView(R.layout.activity_camera_slow_spin); + + mapView = findViewById(R.id.mapView); + mapView.onCreate(savedInstanceState); + mapView.getMapAsync(this); + } + + @Override + public void onMapReady(final MapboxMap mapboxMap) { + mapboxMap.setStyle(Style.SATELLITE_STREETS, new Style.OnStyleLoaded() { + @Override + public void onStyleLoaded(@NonNull Style style) { + SlowlyRotatingCameraActivity.this.mapboxMap = mapboxMap; + + mapboxMap.addOnMapClickListener(SlowlyRotatingCameraActivity.this); + + // Toast instructing user to tap on the map + Toast.makeText( + SlowlyRotatingCameraActivity.this, getString(R.string.rotating_camera_toast_instruction), + Toast.LENGTH_LONG).show(); + + startMapCameraSpinningAnimation(mapboxMap.getCameraPosition().target); + } + }); + } + + @Override + public boolean onMapClick(@NonNull LatLng point) { + startMapCameraSpinningAnimation(point); + return true; + } + + /** + * Set up and start the spin animation. The Android system ValueAnimator emits a new value and that value is + * used as the map camera's new bearing rotation amount. A smooth "new helicopter" type of effect is created + * by using a LinearInterpolator. + * + * @param mapCameraTargetLocation the map location that the map camera should spin around + */ + private void startMapCameraSpinningAnimation(@NonNull final LatLng mapCameraTargetLocation) { + if (animator != null) { + animator.cancel(); + } + animator = ValueAnimator.ofFloat(0, DESIRED_NUM_OF_SPINS * 360); + animator.setDuration( + // Multiplying by 1000 to convert to milliseconds + DESIRED_NUM_OF_SPINS * DESIRED_SECONDS_PER_ONE_FULL_360_SPIN * 1000); + animator.setInterpolator(new LinearInterpolator()); + animator.setStartDelay(1000); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + // Retrieve the new animation number to use as the map camera bearing value + Float newBearingValue = (Float) valueAnimator.getAnimatedValue(); + + // Use the animation number in a new camera position and then direct the map camera to move to the new position + mapboxMap.moveCamera(CameraUpdateFactory + .newCameraPosition(new CameraPosition.Builder() + .target(new LatLng(mapCameraTargetLocation.getLatitude(), mapCameraTargetLocation.getLongitude())) + .bearing(newBearingValue) + .build())); + } + }); + animator.start(); + } + + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mapView.onSaveInstanceState(outState); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapView.onLowMemory(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mapboxMap != null) { + mapboxMap.removeOnMapClickListener(this); + } + if (animator != null) { + animator.end(); + } + mapView.onDestroy(); + } +} diff --git a/MapboxAndroidDemo/src/main/res/layout/activity_camera_slow_spin.xml b/MapboxAndroidDemo/src/main/res/layout/activity_camera_slow_spin.xml new file mode 100644 index 000000000..2ab0d6ab7 --- /dev/null +++ b/MapboxAndroidDemo/src/main/res/layout/activity_camera_slow_spin.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/values/activity_strings.xml b/MapboxAndroidDemo/src/main/res/values/activity_strings.xml index b5ed0888f..47b10fd7f 100644 --- a/MapboxAndroidDemo/src/main/res/values/activity_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/activity_strings.xml @@ -309,6 +309,9 @@ Light polar angle Building opacity + + Try tapping on the map and/or adjusting the zoom + Zoom in and out to see the icons change diff --git a/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml b/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml index ada0aa077..d003a234c 100644 --- a/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml @@ -61,6 +61,7 @@ "Animate the map's camera position, tilt, bearing, and zoom." Position the camera so that all the given markers are in view. Prevent a map from being panned to a different place. + Slowly have the camera circle around a single point. Download and view an offline map using the Mapbox Maps SDK. Download, view, navigate to, and delete an offline region. Download, view, navigate to, and delete an offline region. diff --git a/MapboxAndroidDemo/src/main/res/values/titles_strings.xml b/MapboxAndroidDemo/src/main/res/values/titles_strings.xml index a2f755ff2..7d903f1b6 100644 --- a/MapboxAndroidDemo/src/main/res/values/titles_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/titles_strings.xml @@ -61,6 +61,7 @@ Animate the map camera Fit camera in bounding box Restrict map panning + Rotating camera A simple offline map Offline manager Query a map feature diff --git a/MapboxAndroidDemo/src/main/res/values/urls_strings.xml b/MapboxAndroidDemo/src/main/res/values/urls_strings.xml index 110512522..c9f0260fa 100644 --- a/MapboxAndroidDemo/src/main/res/values/urls_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/urls_strings.xml @@ -60,6 +60,7 @@ http://i.imgur.com/PN3vyNJ.jpg http://i.imgur.com/A0JL21Q.png http://i.imgur.com/A227BEs.jpg + https://i.imgur.com/uuiOK5D.png http://i.imgur.com/dV4DgDT.png http://i.imgur.com/tDlcNIg.png http://i.imgur.com/tDlcNIg.png From 5f7bcce5d44abe11cfe9956519ca2a5b5371cbfe Mon Sep 17 00:00:00 2001 From: Langston Smith Date: Mon, 1 Apr 2019 09:52:10 -0700 Subject: [PATCH 5/8] Animated SymbolLayer icon movement example (pin drop) (#934) * initial additions * animator null check, removed white lines, and created layer id constant * initial style/source/layer refactoring based on review * more review cleanup --- MapboxAndroidDemo/build.gradle | 1 + .../mapboxandroiddemo/MainActivity.java | 10 + .../src/main/AndroidManifest.xml | 9 + .../ValueAnimatorIconAnimationActivity.java | 274 ++++++++++++++++++ .../ic_keyboard_arrow_down.xml | 9 + .../map_marker_push_pin_pink.png | Bin 0 -> 5299 bytes .../map_marker_push_pin_pink.png | Bin 0 -> 2725 bytes .../map_marker_push_pin_pink.png | Bin 0 -> 7207 bytes .../map_marker_push_pin_pink.png | Bin 0 -> 17384 bytes .../map_marker_push_pin_pink.png | Bin 0 -> 28958 bytes .../res/layout/activity_animated_pin_drop.xml | 76 +++++ .../layout/activity_basic_simple_mapview.xml | 5 +- .../src/main/res/values/activity_strings.xml | 5 + .../main/res/values/descriptions_strings.xml | 3 +- .../src/main/res/values/titles_strings.xml | 1 + .../src/main/res/values/urls_strings.xml | 1 + gradle/dependencies.gradle | 1 + 17 files changed, 391 insertions(+), 4 deletions(-) create mode 100644 MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/labs/ValueAnimatorIconAnimationActivity.java create mode 100644 MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_keyboard_arrow_down.xml create mode 100644 MapboxAndroidDemo/src/main/res/drawable-hdpi/map_marker_push_pin_pink.png create mode 100644 MapboxAndroidDemo/src/main/res/drawable-mdpi/map_marker_push_pin_pink.png create mode 100644 MapboxAndroidDemo/src/main/res/drawable-xhdpi/map_marker_push_pin_pink.png create mode 100644 MapboxAndroidDemo/src/main/res/drawable-xxhdpi/map_marker_push_pin_pink.png create mode 100644 MapboxAndroidDemo/src/main/res/drawable-xxxhdpi/map_marker_push_pin_pink.png create mode 100644 MapboxAndroidDemo/src/main/res/layout/activity_animated_pin_drop.xml diff --git a/MapboxAndroidDemo/build.gradle b/MapboxAndroidDemo/build.gradle index 03d11643a..2f3db239a 100644 --- a/MapboxAndroidDemo/build.gradle +++ b/MapboxAndroidDemo/build.gradle @@ -119,6 +119,7 @@ dependencies { implementation dependenciesList.supportCustomTabs implementation dependenciesList.supportV4 implementation dependenciesList.supportConstraintLayout + implementation dependenciesList.supportAnimation // Mapbox dependencies chinaImplementation dependenciesList.mapboxChinaPlugin diff --git a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java index 3c3fea652..e93dda4d1 100644 --- a/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java +++ b/MapboxAndroidDemo/src/global/java/com/mapbox/mapboxandroiddemo/MainActivity.java @@ -84,6 +84,7 @@ import com.mapbox.mapboxandroiddemo.examples.labs.MapFogBackgroundActivity; import com.mapbox.mapboxandroiddemo.examples.labs.MarkerFollowingRouteActivity; import com.mapbox.mapboxandroiddemo.examples.labs.PictureInPictureActivity; +import com.mapbox.mapboxandroiddemo.examples.labs.ValueAnimatorIconAnimationActivity; import com.mapbox.mapboxandroiddemo.examples.labs.PulsingLayerOpacityColorActivity; import com.mapbox.mapboxandroiddemo.examples.labs.RecyclerViewOnMapActivity; import com.mapbox.mapboxandroiddemo.examples.labs.SnakingDirectionsRouteActivity; @@ -1069,6 +1070,15 @@ private void initializeModels() { new Intent(MainActivity.this, MagicWindowKotlinActivity.class), R.string.activity_lab_magic_window_image_url, true, Build.VERSION_CODES.O)); + exampleItemModels.add(new ExampleItemModel( + R.id.nav_lab, + R.string.activity_lab_animated_interpolator_icon_drop_title, + R.string.activity_lab_animated_interpolator_icon_drop_description, + new Intent(MainActivity.this, ValueAnimatorIconAnimationActivity.class), + null, + R.string.activity_lab_animated_interpolator_icon_drop_url, false, BuildConfig.MIN_SDK_VERSION + )); + exampleItemModels.add(new ExampleItemModel( R.id.nav_dds, R.string.activity_dds_geojson_line_title, diff --git a/MapboxAndroidDemo/src/main/AndroidManifest.xml b/MapboxAndroidDemo/src/main/AndroidManifest.xml index 7fc55f9bb..5fcee52ca 100644 --- a/MapboxAndroidDemo/src/main/AndroidManifest.xml +++ b/MapboxAndroidDemo/src/main/AndroidManifest.xml @@ -745,6 +745,15 @@ + + + + * More info about https://developer.android.com/reference/android/view/animation/Interpolator + */ +public class ValueAnimatorIconAnimationActivity extends AppCompatActivity implements + OnMapReadyCallback, MapView.OnDidFinishRenderingMapListener { + + private static final String ICON_ID = "red-pin-icon-id"; + + // This float's actual value will depend on the height of the SymbolLayer icon + private static final float DEFAULT_DESIRED_ICON_OFFSET = -16; + private static final float STARTING_DROP_HEIGHT = -100; + private static final long DROP_SPEED_MILLISECONDS = 1200; + private static final String SYMBOL_LAYER_ID = "symbol-layer-id"; + private MapView mapView; + private SymbolLayer pinSymbolLayer; + private Style style; + private TimeInterpolator currentSelectedTimeInterpolator = new BounceInterpolator(); + private ValueAnimator animator; + private boolean firstRunThrough = true; + private boolean animationHasStarted; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Mapbox access token is configured here. This needs to be called either in your application + // object or in the same activity which contains the mapview. + Mapbox.getInstance(this, getString(R.string.access_token)); + + // This contains the MapView in XML and needs to be called after the access token is configured. + setContentView(R.layout.activity_animated_pin_drop); + + // Initialize the map view + mapView = findViewById(R.id.mapView); + mapView.onCreate(savedInstanceState); + mapView.getMapAsync(this); + } + + @Override + public void onMapReady(@NonNull final MapboxMap mapboxMap) { + mapboxMap.setStyle(new Style.Builder().fromUrl(Style.LIGHT) + // Add GeoJsonSource with random Features to the map. + .withSource(new GeoJsonSource("source-id", + FeatureCollection.fromFeatures(new Feature[] { + Feature.fromGeometry(Point.fromLngLat( + 119.86083984375, + -1.834403324493515)), + Feature.fromGeometry(Point.fromLngLat( + 116.06637239456177, + 5.970619502704659)), + Feature.fromGeometry(Point.fromLngLat( + 114.58740234375, + 4.54357027937176)), + Feature.fromGeometry(Point.fromLngLat( + 118.19091796875, + 5.134714634014467)), + Feature.fromGeometry(Point.fromLngLat( + 110.36865234374999, + 1.4500404973608074)), + Feature.fromGeometry(Point.fromLngLat( + 109.40185546874999, + 0.3076157096439005)), + Feature.fromGeometry(Point.fromLngLat( + 115.79589843749999, + 1.5159363834516861)), + Feature.fromGeometry(Point.fromLngLat( + 113.291015625, + -0.9667509997666298)), + Feature.fromGeometry(Point.fromLngLat( + 116.40083312988281, + -0.3392008994314591)) + }) + )) + .withImage(ICON_ID, BitmapUtils.getBitmapFromDrawable( + getResources().getDrawable(R.drawable.map_marker_push_pin_pink))), new Style.OnStyleLoaded() { + @Override + public void onStyleLoaded(@NonNull Style style) { + ValueAnimatorIconAnimationActivity.this.style = style; + mapView.addOnDidFinishRenderingMapListener(ValueAnimatorIconAnimationActivity.this); + } + } + ); + } + + /** + * Implementing this interface so that animation only starts once all tiles have been loaded + * + * @param fully whether or not the map is finished rendering + */ + @Override + public void onDidFinishRenderingMap(boolean fully) { + initAnimation(currentSelectedTimeInterpolator); + initInterpolatorButtons(); + } + + /** + * Initialize and start the animation. + * + * @param desiredTimeInterpolator the type of Android system movement to animate the + * SymbolLayer icons with. + */ + private void initAnimation(TimeInterpolator desiredTimeInterpolator) { + if (animator != null) { + animator.cancel(); + } + animator = ValueAnimator.ofFloat(STARTING_DROP_HEIGHT, 0); + animator.setDuration(DROP_SPEED_MILLISECONDS); + animator.setInterpolator(desiredTimeInterpolator); + animator.setStartDelay(1000); + animator.start(); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + if (!animationHasStarted) { + initSymbolLayer(); + animationHasStarted = true; + } + pinSymbolLayer.setProperties(iconTranslate(new Float[] {0f, (Float) valueAnimator.getAnimatedValue()})); + } + }); + } + + /** + * Add the SymbolLayer to the map + */ + private void initSymbolLayer() { + pinSymbolLayer = new SymbolLayer(SYMBOL_LAYER_ID, + "source-id"); + pinSymbolLayer.setProperties( + iconImage(ICON_ID), + iconIgnorePlacement(true), + iconAllowOverlap(true), + iconOffset(new Float[] {0f, DEFAULT_DESIRED_ICON_OFFSET})); + style.addLayer(pinSymbolLayer); + } + + /** + * Initialize the interpolator selection spinner menu + */ + private void initInterpolatorButtons() { + + FloatingActionButton bounceInterpolatorFab = findViewById(R.id.fab_bounce_interpolator); + bounceInterpolatorFab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (firstRunThrough) { + firstRunThrough = true; + } + currentSelectedTimeInterpolator = new BounceInterpolator(); + resetIcons(); + } + }); + + FloatingActionButton linearInterpolatorFab = findViewById(R.id.fab_linear_interpolator); + linearInterpolatorFab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + currentSelectedTimeInterpolator = new LinearInterpolator(); + firstRunThrough = false; + resetIcons(); + } + }); + + FloatingActionButton accelerateInterpolatorFab = findViewById(R.id.fab_accelerate_interpolator); + accelerateInterpolatorFab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + currentSelectedTimeInterpolator = new AccelerateInterpolator(); + firstRunThrough = false; + resetIcons(); + } + }); + + FloatingActionButton decelerateInterpolatorFab = findViewById(R.id.fab_decelerate_interpolator); + decelerateInterpolatorFab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + currentSelectedTimeInterpolator = new DecelerateInterpolator(); + firstRunThrough = false; + resetIcons(); + } + }); + } + + private void resetIcons() { + if (!firstRunThrough) { + animationHasStarted = false; + style.removeLayer(SYMBOL_LAYER_ID); + initAnimation(currentSelectedTimeInterpolator); + } + } + + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + if (animator != null) { + animator.end(); + } + mapView.onStop(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mapView.onSaveInstanceState(outState); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapView.onLowMemory(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } +} \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_keyboard_arrow_down.xml b/MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_keyboard_arrow_down.xml new file mode 100644 index 000000000..ad33063c8 --- /dev/null +++ b/MapboxAndroidDemo/src/main/res/drawable-anydpi/ic_keyboard_arrow_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/MapboxAndroidDemo/src/main/res/drawable-hdpi/map_marker_push_pin_pink.png b/MapboxAndroidDemo/src/main/res/drawable-hdpi/map_marker_push_pin_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..2c609da19f5b9b09f9038516985b859b91f53ade GIT binary patch literal 5299 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 z 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 literal 0 HcmV?d00001 diff --git a/MapboxAndroidDemo/src/main/res/drawable-xhdpi/map_marker_push_pin_pink.png b/MapboxAndroidDemo/src/main/res/drawable-xhdpi/map_marker_push_pin_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..8176fc9330f1a14ab8556b8140bf914371ba28a3 GIT binary patch literal 7207 zcmV+?9N6QDP)C z8}`^6WoR>BdH;RB`36U#xyiqhE8Lq|>#P9;froeR{qA%28HM7X$3KsM9{)T({D4C7 z2^9DQzP{y(mwj;gV0-)W#qYC!r_cMJ1r$s`;2TpxTEW5P|J2vBueI^5AT5Ha_-_R% zDT&}9CZ@uNKWF3@O7lgAgu4TZLWrumch_b!|jGPB_4!+U6*DV!a0t6;{V7kSfyv-2nH&C46JQ=K<- zYksavV0Nxuz{{N8t8e9WUy+dAb=jV5n34za#?cpTkfz?EnhA_Ml+o4itK9L7`(H zRQ=aMu>A%2kyiJ$D70CQmtQZ)dC_rR%+n5YCqHQCTVMOVVp!;wwXkKmO8YjqIJ~QB zT}(K)J4L|BOd#SG5PAvfeW{{qV;onw{3KWC8_MNR2@>+h?H2M!ZWrq zUFDT2VEKXZM%?Gpm1t13MTH8l$Gzf z3;CmVAaD3K5I88^HbLpU0R#@Y{nsMbb~SQ(`Xi_Na!{CxS)Kia*VYTU=bh$pFRbQ5 zX|)g!ThA!EYcYLxnE}W07kgH3OR(a%CA>iFeF$eV1wQIJ$Aw)G)mzR$we$pv=1~a# zd<2EF52J9#Ar!E1oU|YL;|bi@UC5)bq~71DWwQitIxl8nisx2yg{ST3s2{hT4Q0FexM$&W*jEO|>`EyGrm+sH-6>!3+mn=t z%!H71TO~x_5V?@^Q2!DQ)v}XNEg@)&kE3Y8Q4Khzw&@2^FeL~D6ZU~Z6#1ifB5%ZY z#rOEk#xrKfL;8AzpNvk7riCc-(G|@UYEHRX%~c z({kD`rB-bkbE-+a{LbVP2)PO&=4O!)cMDu-2Gr|gpk5mV_3G15t%x9S;V4>o3`KLp zP&nsZwH1ut`!-C6ZPTdDbt9Bc6s7}7ZT;42)Yg;K_C1B^x3b!-No^hH;Yo*|@u=-A z;X&&exYx>uzth5}1^c;z6{W1I2Fofd+LdI^?@Un%ds4xlzAg%I24Fy>bS#6s9me2Crm|YsRQJ5;-No_6^rVcDj12kdUYn7}v7N&l9{mml0 z_*zz5`#Jcv?M(ho1K%4dYOqL#|gL~uqcac>&<9m(L2ToC!NiyCN@%ecT;DMX9a z#&X-D<5GSrl){wM=0j?mOkwKH)Fy|iwkWv1TNH9^n^aBT7KQwGio(X)zF&r`ou-d0ozUzx(4H&2EQ*#M zhj1{1)RrVNfc)+h_O?cC8!1fJk=oXf+E$*@sErkc`A227{XdIBceyA~m`ZBvFc&Yo zFXf+ny8sDQ-KR>>6gH(3+MDJJTPhtkfFpGYEIhX-L0Y>~z-hs4pfC-P)g~2%6CW-L z-hZGdNZw6W8x@2%1TNcl6(03l!Ch@W0m)U}XOwDaSv~wLl>GuEwU9Rx`NZ4c$!_pl z6TxpHV4LG9Oi67UVkB^XyeRB^wx*!%cc-zVVXzZJDXtM?lupX`poC9Sx!Q7 zUS)wlR-Us#0BvH8Z2;zg+5UxJ~AA1A*-c)ewW5LPx;~llVQxrmeTNGrq zDcv`Nns`l!()Y?E)#bZxMh+?PQQzfAYw3l!8g97McL8^`g*TG)+^3gLXqtU3#mldk z)Xp8aE=x5z80swv0)LA9+NED1KFNZZQwZ^;62jHT;3Kbs+m{M8tEj8xqEIroX`xM! z)yBY)4Jlx2>~3l0QNDZS5r{jsi;-sOh3LwTh%P@6iDpA_vF`%@LK9CURCN2XR6^4Q zM~QkLrXK^fQbnxa6q4^iNT4u1lL^L148;`@;s)KPxL8?*= zKvd;{h%s;?V9tm&a2DhAomCebj7Ivm)1Ri+9A2+fb_4J8YuV#=)>Caha~Wr!0_Pr5 z4|+%BBdI%JJt&2w6ox(rH7yhQFey(BTt_aSl6u$W$g(28)p{e8PQc85M6PA826rftwm zouU0Bijyj;Z^#b?0aPImp9gm^UF6nL?qZ&d`7uiLEWzgu+bZ>zl7%3%n*Hrk$)vJ& z=wX|gY_|e8znX|E4aea^JqkUO;Yg|Ffp`OgR@ojg&4zJl7UK|a=&`N1A6AsXZEvmO zo+>O2-!xs2t0YC`Y={z+JI)|)RRr>9hajK%Fy{D~+h+|qbNS5SQ!mLH@aNPHJ!(4} z_bsO5cC*R2*2oJPW}_)I2P29?^SJ&%oHQSd1c!y{3*BZRQQ_*xzUMi`$bXf|GlJp` zz@b|z=l1fyCwK)xwK0w_in@k^#9PPA3>0Y!*wQ zdB5#U+-Nxk=PCIo)EkBqM$R}?tv`bF``|$J{s`3@fcTc4xZ=7}ecNU>k`yje$}}|H z5}(t3c?!k{Q|}qiQEr2Hj;u$_O{fp1qmZmdp6?OljM#>(fdP2^!wS6kW+5I>F1y-d z5>gwEMpPXS9IfGqV1gA?r8h$K`{B5uJtFlSk=A+wZo04LZ(9Gvpt);2SsBV@AF?4i zJywLm>j1S+u^bl=7}?8 zRwImDaJaf14(j#6;i~;{%)lO}st~kx6U7^DtHn$0ClfU1A4;u}{j=>=cJ~$QFzx^W ziXo*Dv^0ViP0)hRK}CguL1VooYl~PRV9*}5*FZ}rXz_K2;$$rsgivT6(1ljn0p~hS z5pTHqBi+IaDGHZ1Wwr7c>)8VP?>EBg7YB$?>lsW@Z3++HjXzSk# z?F>PaltvX(%4zy-;7ZV{;bsYnSXk7vd^lP1VvCUj{rdvrRw=1 zXuVd+(0DhRVQeA z1g+OR@k*chNU1tFE3N*h&FLniet=HTS?cYF?%<2sC&Z#~Uf8Chr6=AXFcC#Q2iVT6 z$REE1F`b~r+@M~RplyiNfwn<9VPgCIPptkOv;l~$=8TKB^KrSy95F`U6$$mJCp8_0 zB;z61Q;Y_C-!s$XIA%dg>3*697$zLnS1&ucR=qw}z`@HvP&(ARlK6tzheejV_^=B) z(9$Jn+VErtCJb8EAAokW+5nt3aA7;NxY%tb!mBunL1s?sFcTLc*2F_<>JyCIZzR<8 z=u@(_D<%0$Gx)+SkF-_?#y!Nb8{k7PFeqyE)&zm=#Io~D3EGkK?|~Lp0@@OS<|{$V zAZQ6@!+#5{svS<(a>d1d3z5-f8of_#mYFk-)NvNWjGg%twO!O_j69H5YcS5#)HL#? zrm|`kRx6t$nnu(jFwDb;>aF}}2{q>x2*wh)JCN4N`?7~_vE~=KRaJklSoG~1TsG zcpPChz0D3w2p$)77J}Tc{}x)HbR_pKG%pRb z+DvIW(DdvORo4TT`Y%G7<#-&drGXY=>VnWZ1kGd+B8&&&w2`Y2SJRb0UvmiJ4P2Zw zYWs+7mUfnw-;o@`X3^N00Dtrn)SKg>_K$pfioWQ$q%w9O% zwDc*4cB;1PJJ7-^^+$B$VYtwBCSvOk#U3*!1lM!HAv1zzIta(>48lnhS47ozL%fk2 zmtJcKsm&$rqlT$=o)%jYYV*5Ovk*x=<*DlexBo1uEJiczBF$_>$TJ&9rLzGx(;*Nr zX$*@LsoEHa0@>WMjmWpq=4zldm7y8CB9w)veqT+)UUdMXjTjVn>?L5k8aN|Jf;I?Y zW^Rb6>y8-H!APnz6sg8Tg|kM3kx;``nXK<*_R;#&;?Uf4ww1U$6~gh$5F)OM+^*!e zqg5qmHrNE@qGQsL9k(|X>fI^tDvd$wvs#)0de(`cwf4b{s=@GyCIa6cHqn2 zIP`@rj#Q(fVC;Y$=1$ntXb=uJ^uURRLlN6>1dD)$pV3gcMIcQa3zFW_EB{<`uLd7aX>xdGE4&)04xY`& zk&EE>rU|SFaN83#qgBN-8uf>ZWm*Zi#g~+t| z8P~hame#Eil0%N7k9q#wLj_2qD9GHq_%ovakbSX@p8xMIM;9tlJwmzKR&cRE6sDet}NgWra{bnAyRJ%ehX9D z8E{)jZ5!j>QxuN!t zOvH_56LG8KOkA^`DPHR7i*wC9k*IKK_0f9LVrVvt&2#&$DJUGV3+mYGqWC5s;_c_) z!!K(>G$2|7jfLqdO_-J(w)4en&dYJmd^94fI9h3-wP6?3K9v{S!eYuR zUjpLabJFy>^MX2*xU*HBdr-7ATwqf`eEcnlPqP6|ke2u|7ktJ8aMX87ietHLzIKRD zGyPaN?E`9a-~1L@{{VUNk)V;<*w|=p&y~{0-t=9K$F|FH^}C-D-^vpwjGb|+(m*8C z9*j$U7KqoJmLawNNcAB-JEpV>_KNy?^jwM7m$Vqb&uLYZAy&|V_g9{4zTMzc4)`S< z`kusL~f9pV=b3>Oh<}a6*Fd z5M1uRNPXAYpN#JCRQhrC6;({CHBnTqPH$JERaN?!Lct(bmLYyF!z=%ngVPR}gWYp8Q{X{?XU|_1*btpRknz#YaxYf zA#1nhv+*mw>NQ_x1_I;}_cfB?Me>yPI@F2kd)3#7!(+Nx{hzb@1rjg%Tg5L2C+@@kIK-r6DR zM-Nu*D?Nu&o5i3->N{{rb%)|k?}do5p5V*EuumP!+VosgXVuVIT6p@h;{G1BX>*&@ z9V`vsfzazfY$hq~u3BINebi%0&{%U$t(A0VfL*khykDB!mOL4S8aq^xsw1n6?4npF z@?h=BO0*{bMHTT*v#FBPza|^jw7SC)Z|s3n)G07%2le_&$9tqSk)Uzm)$REt16Q0e zb{9?>51Pz?*%&sfRpVV?y3n+Wt0sr4wosJ&n~K8Q%dqOL3FCy5SKr`z7Lf6XDUIV# zT;|jV&WS2Ax>E9IHe+g#bipEz626joGIkq)=wEa5i~oIpa}$xJ4E4ms+t2E@2YuLj2JW_;rfH8Fj~5A=K+yQO+U|UWp%c%P7N$=j zsXqWm^!w53pSrJVZ+5+hL8@l^c{5XzjnR8x8OVj;Lq*^}^1=e2=w9we$i*7Msq3To zqZgyN;B$G{oDBG#2Ihu?_n{DFS9#b?Vvo%nK~v}0t>v>wY3zCqn}mGUX`VEm@UYDc zo|MMj`f8HEly7RhZ77%-l1kzEj6oB}?gK{b z1w3{Gj+;^R!y2*Ro8`#+dI@qmEyC+I^Te#SbMdM*!D~JZHycwSXfP%>$#m$AQ${Y~ z2dek?TUDv6{g0oTw2+|~({JDKJB4v0Q^jX&wu3=4rBz1oERBSB&n>j58 zuAcmP3|ws)nw}hrA4ge#7$AG`68qnI@e&Kgw?ig-W6tuWV((!dqF%SoV)w!BP}qJm zSWeW9r~+LAuTF8zPS0McqKf3CRUEd6Gc1QzM{9MH{AL;OtT2|PE8fntV|T2x7Snrt1bO^tSxFKAy+6`%0QdR;F`$r8tQ;E)fNajJU=b9N_)?v zoSaXp>D8&jexZh4x^x+_%6}C?LJo^FXU-Pw9UMiU=`-Ox$ZZ-^mZ6bRXL{~Lt0S!r zwA#~R;Mg#qr3{aOYazpXpX%z#VOmSBoL|T}txP~GFPC_u1`QgpU(lj&-@cwZckD!L zTs)R6T`szN3=tPB^uv&0BYvWPZ)aj+W<$@`w7!<%S;^qq$?#gs@Jg!gD_M2A;7sH& z)m2-WfX05{+D)1?Val-R{o{|GVPRpoe*Fg4tq&AOjUFSeS`z?IPj7bpu!E^-{qN|R zsqGsX-oI0wg{(SVa1G_+U?TgpN@YoD<>W+c(5zWA_SZN6zH8Uv5ho+?=+R?w6Xmrr zW5jL5BJ&{4Ps$ai;H+ue-R+smHvw9CWUBzjknac&CmTWsd`&;_Uzsm^Af8j4X zbm+hgXZ3G8cXo)1io(m6udsQ`R&n$gPlC1q<0njF;b~Q`UcK%*(5!Vr^!M^xb2+ay zl8b?L8yg!IBIUofvg#R6`An(I!w2^@39MLg_V&_#y`n{vCS8(}lE85swr<-&Ic=;Io)acbWj9gU z$>C`&!}>}mKWPoDnU0Ayks)c@ChhKpZZlqX2bz6-HJh0o+qLVIn2?B~A{9Z~UJT89 z;uQ9Z2W`#F%x&Zf*+@3220FX1RZHx`R?*qc{`{l&mVXzt?%lh0ij9p$c6N@qWy`kW zoaXI4#fPcO+}zws_FP6X6fKO3I{W+DgA(1tlG4#v{-q~d@`ywK{{5{_N1n#hXV1Z^ z=jgFAw2711<^2{-n>KAO1FNi)k3RXG_22u@Ds7m%d;8 zDO0A8WBJO`(z33suum2LtFJ^_QfaomdJT(-j={rUAF)D!@!k`$Y0GwadU^Y^WNvM3 zT~!Xla*F@;hxUM`L)*3k{r&ypj~x%cvuLs3lR>U-_a{%8de+(5c~ZA--Sqwe_I|Ug pkdr&J5^cz0w2&=Bh0^4y{tv|fbbbpmOv(TN002ovPDHLkV1n%VAcFt^ literal 0 HcmV?d00001 diff --git a/MapboxAndroidDemo/src/main/res/drawable-xxhdpi/map_marker_push_pin_pink.png b/MapboxAndroidDemo/src/main/res/drawable-xxhdpi/map_marker_push_pin_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee8ef873df8291f46a5a5ff1f0c2bb8caf1c68a GIT binary patch literal 17384 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 JPDHLkV1n+VrZxZo literal 0 HcmV?d00001 diff --git a/MapboxAndroidDemo/src/main/res/layout/activity_animated_pin_drop.xml b/MapboxAndroidDemo/src/main/res/layout/activity_animated_pin_drop.xml new file mode 100644 index 000000000..9a6110d43 --- /dev/null +++ b/MapboxAndroidDemo/src/main/res/layout/activity_animated_pin_drop.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml b/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml index 4a4458d65..b459289ce 100644 --- a/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml +++ b/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml @@ -1,6 +1,5 @@ - + mapbox:mapbox_cameraZoom="11" /> \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/values/activity_strings.xml b/MapboxAndroidDemo/src/main/res/values/activity_strings.xml index 47b10fd7f..adc3b29e5 100644 --- a/MapboxAndroidDemo/src/main/res/values/activity_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/activity_strings.xml @@ -315,4 +315,9 @@ Zoom in and out to see the icons change + + Bounce interpolator + Linear interpolator + Accelerate interpolator + Decelerate interpolator \ No newline at end of file diff --git a/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml b/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml index d003a234c..3996c0786 100644 --- a/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/descriptions_strings.xml @@ -75,7 +75,7 @@ Use Mapbox Java Services to request directions. Use Mapbox\'s Optimization API to retrieve and display the quickest multi-stop route. Use Mapbox Java Services to build a url and download a static map. - Use the Directions Matrix API to receive driving times between 2-25 different locations. + Use the Matrix API to receive driving times between 2-25 different locations. Use the Geocoding API to receive information about specific coordinates. Use the Isochrone API to receive information about how far you can travel within a given time. Use the Tilequery API to search for features in a tileset. This example queries for up to 10 buildings which are within 50 meters of the single map click location. @@ -111,6 +111,7 @@ Show calendar event locations on the map. Combine two maps for a magic window effect Add a gradient on top of a MapView to show a background fog effect. + Use Android system interpolators to animate SymbolLayer icons movement. Show an accurate and government-approved China map in your app using the Mapbox Maps SDK. diff --git a/MapboxAndroidDemo/src/main/res/values/titles_strings.xml b/MapboxAndroidDemo/src/main/res/values/titles_strings.xml index 7d903f1b6..1c4f96d39 100644 --- a/MapboxAndroidDemo/src/main/res/values/titles_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/titles_strings.xml @@ -109,6 +109,7 @@ Calendar integration Magic Window Background fog + Animated icon movement China map view diff --git a/MapboxAndroidDemo/src/main/res/values/urls_strings.xml b/MapboxAndroidDemo/src/main/res/values/urls_strings.xml index c9f0260fa..12e230a72 100644 --- a/MapboxAndroidDemo/src/main/res/values/urls_strings.xml +++ b/MapboxAndroidDemo/src/main/res/values/urls_strings.xml @@ -111,6 +111,7 @@ https://i.imgur.com/M8TU7nH.png https://i.imgur.com/Nw78ZrV.png https://i.imgur.com/NcSGgD8.png + https://i.imgur.com/JfLf69C.png https://i.imgur.com/KwoEynZ.png diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 8a92b8bec..e18ce9f99 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -86,6 +86,7 @@ ext { supportCustomTabs : "com.android.support:customtabs:${version.supportLib}", supportConstraintLayout : "com.android.support.constraint:constraint-layout:${version.constraintLayout}", supportAnnotations : "com.android.support:support-annotations:${version.supportAnnotations}", + supportAnimation : "com.android.support:support-dynamic-animation:${version.supportLib}", // Square timber : "com.jakewharton.timber:timber:${version.timber}", From 8c99de76ad8e8ab51285e825eb6c663f1c3e9cd4 Mon Sep 17 00:00:00 2001 From: Langston Smith Date: Mon, 1 Apr 2019 11:29:46 -0700 Subject: [PATCH 6/8] Release branch for 7.3.0 release (#1005) --- CHANGELOG.md | 9 +++++++++ MapboxAndroidDemo/src/global/play/en-US/whatsnew | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24613f723..b2ce6d52d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ Mapbox welcomes participation and contributions from everyone. +## 7.3.0 + +* Multiple text field format +* Symbol listener +* Click to add image +* Symbol switch based on zoom level +* Rotating map camera +* Animated SymbolLayer icon + ## 7.2.0 diff --git a/MapboxAndroidDemo/src/global/play/en-US/whatsnew b/MapboxAndroidDemo/src/global/play/en-US/whatsnew index 217389719..79a1ed763 100644 --- a/MapboxAndroidDemo/src/global/play/en-US/whatsnew +++ b/MapboxAndroidDemo/src/global/play/en-US/whatsnew @@ -1 +1,8 @@ -This update is in line with the 7.2.0 release of the Mapbox Maps SDK for Android and includes several improvements. \ No newline at end of file +This update is in line with the 7.3.0 release of the Mapbox Maps SDK for Android and includes several improvements and new examples: + +•Multiple text field format +•Symbol listener +•Click to add image +•Symbol switch based on zoom level +•Rotating map camera +•Animated SymbolLayer icon From d7a737a0af41ab17729e22ac1a214d73e4a9b959 Mon Sep 17 00:00:00 2001 From: Langston Smith Date: Mon, 1 Apr 2019 11:58:37 -0700 Subject: [PATCH 7/8] geocoding xml tweak to unblock release (#1006) --- .../src/main/res/layout/activity_javaservices_geocoding.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapboxAndroidDemo/src/main/res/layout/activity_javaservices_geocoding.xml b/MapboxAndroidDemo/src/main/res/layout/activity_javaservices_geocoding.xml index 92e0c71fa..33678a440 100644 --- a/MapboxAndroidDemo/src/main/res/layout/activity_javaservices_geocoding.xml +++ b/MapboxAndroidDemo/src/main/res/layout/activity_javaservices_geocoding.xml @@ -1,6 +1,6 @@ Date: Mon, 1 Apr 2019 12:14:49 -0700 Subject: [PATCH 8/8] more xml tweaks to unblock 7.3.0 release (#1007) --- .../layout/activity_basic_simple_mapview.xml | 3 ++- .../activity_javaservices_geocoding.xml | 23 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml b/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml index b459289ce..ad3638d04 100644 --- a/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml +++ b/MapboxAndroidDemo/src/main/res/layout/activity_basic_simple_mapview.xml @@ -1,5 +1,6 @@ - + mapbox:mapbox_cameraZoom="11" /> + android:layout_marginTop="8dp" + android:layout_marginRight="8dp"> + mapbox:layout_constraintBottom_toBottomOf="parent" + mapbox:layout_constraintEnd_toEndOf="parent" + mapbox:layout_constraintStart_toEndOf="@+id/geocode_latitude_editText" + mapbox:layout_constraintTop_toTopOf="@+id/geocode_latitude_editText" />