diff options
author | Langston Smith <langston.smith@mapbox.com> | 2019-05-27 19:05:24 -0700 |
---|---|---|
committer | langsmith <langstonlmcs@gmail.com> | 2019-09-19 14:15:55 -0700 |
commit | ddf84d3fd28bd7ec0f6b69bbc8503b9b33d552ff (patch) | |
tree | 660a4f831f4009da1532a494cddbffeb74d3283a | |
parent | d1459ec2272959b0bffa8ea73ae07f949ad386b1 (diff) | |
download | qtlocation-mapboxgl-ddf84d3fd28bd7ec0f6b69bbc8503b9b33d552ff.tar.gz |
[android] adding tilt logic when shift key is held down during up/down
m--------- | mapbox-gl-js | 0 | ||||
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java | 84 | ||||
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapKeyListener.java | 47 | ||||
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java | 14 | ||||
m--------- | platform/android/vendor/mapbox-events-android | 0 | ||||
m--------- | platform/android/vendor/mapbox-gestures-android | 0 | ||||
m--------- | platform/android/vendor/mapbox-java | 0 | ||||
m--------- | platform/darwin/docs/theme | 0 | ||||
m--------- | platform/ios/vendor/mapbox-events-ios | 0 | ||||
m--------- | vendor/args | 0 | ||||
m--------- | vendor/boost | 0 | ||||
m--------- | vendor/earcut.hpp | 0 | ||||
m--------- | vendor/geojson.hpp | 0 | ||||
m--------- | vendor/geometry.hpp | 0 | ||||
m--------- | vendor/jni.hpp | 0 | ||||
m--------- | vendor/kdbush.hpp | 0 | ||||
m--------- | vendor/pixelmatch-cpp | 0 | ||||
m--------- | vendor/rapidjson | 0 | ||||
m--------- | vendor/supercluster.hpp | 0 | ||||
m--------- | vendor/variant | 0 |
20 files changed, 120 insertions, 25 deletions
diff --git a/mapbox-gl-js b/mapbox-gl-js -Subproject 7ea73ed381a81c3ff7e48b523b25d50793baf1f +Subproject cf577993c04a2590185322a0a4e2eaec04ba1b4 diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java index 90e3934f7c..84d92e73dc 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java @@ -12,6 +12,7 @@ import android.support.annotation.Nullable; import android.view.InputDevice; import android.view.MotionEvent; import android.view.animation.DecelerateInterpolator; +import android.view.animation.LinearInterpolator; import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.android.gestures.MoveGestureDetector; @@ -86,6 +87,7 @@ final class MapGestureDetector { private Animator scaleAnimator; private Animator rotateAnimator; + private Animator pitchAnimator; private final List<Animator> scheduledAnimators = new ArrayList<>(); /** @@ -251,6 +253,7 @@ final class MapGestureDetector { cancelAnimator(scaleAnimator); cancelAnimator(rotateAnimator); + cancelAnimator(pitchAnimator); dispatchCameraIdle(); } @@ -311,8 +314,15 @@ final class MapGestureDetector { // Get the vertical scroll amount, one click = 1 float scrollDist = event.getAxisValue(MotionEvent.AXIS_VSCROLL); - // Scale the map by the appropriate power of two factor - transform.zoomBy(scrollDist, new PointF(event.getX(), event.getY())); + // Check whether a keyboard shift key is held down while the scrolling is happening. If so, + // tilt the map to scroll. More info at + // https://developer.android.com/reference/android/view/KeyEvent.html#META_SHIFT_ON + if (event.getMetaState() == 1) { + transform.setTilt(transform.getTilt() - scrollDist); + } else { + // Scale the map by the appropriate power of two factor + transform.zoomBy(scrollDist, new PointF(event.getX(), event.getY())); + } return true; @@ -881,6 +891,41 @@ final class MapGestureDetector { } } + private Animator createPitchAnimator(double currentPitch, double pitchAddition, long animationTime) { + ValueAnimator animator = ValueAnimator.ofFloat((float) currentPitch, (float) (currentPitch + pitchAddition)); + animator.setDuration(animationTime); + animator.setInterpolator(new LinearInterpolator()); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + + @Override + public void onAnimationUpdate(@NonNull ValueAnimator animation) { + Float floatValue = (Float) animation.getAnimatedValue(); + transform.setTilt(floatValue.doubleValue()); + } + }); + + animator.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationStart(Animator animation) { + transform.cancelTransitions(); + cameraChangeDispatcher.onCameraMoveStarted(REASON_API_ANIMATION); + } + + @Override + public void onAnimationCancel(Animator animation) { + transform.cancelTransitions(); + } + + @Override + public void onAnimationEnd(Animator animation) { + dispatchCameraIdle(); + } + }); + return animator; + } + + private Animator createScaleAnimator(double currentZoom, double zoomAddition, @NonNull final PointF animationFocalPoint, long animationTime) { ValueAnimator animator = ValueAnimator.ofFloat((float) currentZoom, (float) (currentZoom + zoomAddition)); @@ -927,6 +972,26 @@ final class MapGestureDetector { } /** + * Adjust the map camera so that the map's plane is tilted up. + * + * @param runImmediately if true, animation will be started right away, otherwise it will wait until + * {@link MotionEvent#ACTION_UP} is registered. + */ + void pitchCameraUpAnimated(boolean runImmediately) { + pitchAnimated(true, runImmediately); + } + + /** + * Adjust the map camera so that the map's plane is tilted down. + * + * @param runImmediately if true, animation will be started right away, otherwise it will wait until + * {@link MotionEvent#ACTION_UP} is registered. + */ + void pitchCameraDownAnimated(boolean runImmediately) { + pitchAnimated(false, runImmediately); + } + + /** * Zoom out by 1. * * @param zoomFocalPoint focal point of zoom animation @@ -954,6 +1019,21 @@ final class MapGestureDetector { } } + private void pitchAnimated(boolean pitchUp, boolean runImmediately) { + //canceling here as well, because when using a button it will not be canceled automatically by onDown() + cancelAnimator(pitchAnimator); + + pitchAnimator = createPitchAnimator( + transform.getTilt(), + pitchUp ? -5 : 5, + MapboxConstants.ANIMATION_DURATION); + if (runImmediately) { + pitchAnimator.start(); + } else { + scheduleAnimator(pitchAnimator); + } + } + private void dispatchCameraIdle() { // we need to dispatch camera idle callback only if there is no other gestures in progress if (noGesturesInProgress()) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapKeyListener.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapKeyListener.java index afb80027d9..f4f3885e81 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapKeyListener.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapKeyListener.java @@ -34,13 +34,14 @@ final class MapKeyListener { } /** - * Called when the user presses a key, alse called for repeated keys held down. + * Called when the user presses a key, also called for repeated keys held down. * * @param keyCode the id of the pressed key * @param event the related key event - * @return true if the wevent is handled + * @return true if the event is handled */ boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { + // If the user has held the scroll key down for a while then accelerate // the scroll speed double scrollDist = event.getRepeatCount() >= 5 ? 50.0 : 10.0; @@ -86,8 +87,13 @@ final class MapKeyListener { // Cancel any animation transform.cancelTransitions(); - // Move up - transform.moveBy(0.0, scrollDist, 0 /*no animation*/); + if (event.isShiftPressed()) { + // decrease pitch value + mapGestureDetector.pitchCameraDownAnimated(true); + } else { + // Move up + transform.moveBy(0.0, scrollDist, 0 /*no animation*/); + } return true; case KeyEvent.KEYCODE_DPAD_DOWN: @@ -98,8 +104,13 @@ final class MapKeyListener { // Cancel any animation transform.cancelTransitions(); - // Move down - transform.moveBy(0.0, -scrollDist, 0 /*no animation*/); + if (event.isShiftPressed()) { + // decrease pitch value + mapGestureDetector.pitchCameraUpAnimated(true); + } else { + // Move down + transform.moveBy(0.0, -scrollDist, 0 /*no animation*/); + } return true; default: @@ -116,6 +127,7 @@ final class MapKeyListener { * @return true if event is handled */ boolean onKeyLongPress(int keyCode, KeyEvent event) { + // Check which key was pressed via hardware/real key code switch (keyCode) { // Tell the system to track these keys for long presses on @@ -127,8 +139,7 @@ final class MapKeyListener { } // Zoom out - PointF focalPoint = new PointF(uiSettings.getWidth() / 2, uiSettings.getHeight() / 2); - mapGestureDetector.zoomOutAnimated(focalPoint, true); + zoomMapCameraIn(); return true; default: @@ -162,9 +173,7 @@ final class MapKeyListener { return false; } - // Zoom in - PointF focalPoint = new PointF(uiSettings.getWidth() / 2, uiSettings.getHeight() / 2); - mapGestureDetector.zoomInAnimated(focalPoint, true); + zoomMapCameraIn(); return true; } @@ -190,8 +199,7 @@ final class MapKeyListener { // Cancel any animation transform.cancelTransitions(); - // Scroll the map - transform.moveBy(-10.0 * event.getX(), -10.0 * event.getY(), 0 /*no animation*/); + zoomMapCameraIn(); return true; // Trackball was pushed in so start tracking and tell system we are @@ -217,9 +225,7 @@ final class MapKeyListener { // Only handle if we have not already long pressed if (currentTrackballLongPressTimeOut != null) { - // Zoom in - PointF focalPoint = new PointF(uiSettings.getWidth() / 2, uiSettings.getHeight() / 2); - mapGestureDetector.zoomInAnimated(focalPoint, true); + zoomMapCameraIn(); } return true; @@ -268,4 +274,13 @@ final class MapKeyListener { } } } + + /** + * Zooms the map camera in. Used at several places within this class. + */ + private void zoomMapCameraIn() { + // Zoom in + PointF focalPoint = new PointF(uiSettings.getWidth() / 2, uiSettings.getHeight() / 2); + mapGestureDetector.zoomInAnimated(focalPoint, true); + } } 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 cf675bba54..efc370a51e 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 @@ -131,20 +131,20 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { // inflate view View view = LayoutInflater.from(context).inflate(R.layout.mapbox_mapview_internal, this); - view.setNextFocusForwardId(R.id.logoView); - view.setNextFocusRightId(R.id.logoView); + view.setNextFocusForwardId(R.id.compassView); + view.setNextFocusRightId(R.id.compassView); view.setNextFocusLeftId(R.id.attributionView); compassView = view.findViewById(R.id.compassView); + compassView.setNextFocusForwardId(R.id.attributionView); + compassView.setNextFocusRightId(R.id.attributionView); + compassView.setNextFocusLeftId(view.getId()); logoView = view.findViewById(R.id.logoView); logoView.setImageDrawable(BitmapUtils.getDrawableFromRes(getContext(), R.drawable.mapbox_logo_icon)); - logoView.setNextFocusForwardId(R.id.attributionView); - logoView.setNextFocusRightId(R.id.attributionView); - logoView.setNextFocusLeftId(view.getId()); attrView = view.findViewById(R.id.attributionView); attrView.setImageDrawable(BitmapUtils.getDrawableFromRes(getContext(), R.drawable.mapbox_info_bg_selector)); attrView.setNextFocusForwardId(view.getId()); - attrView.setNextFocusRightId(view.getId()); - attrView.setNextFocusLeftId(R.id.logoView); + attrView.setNextFocusRightId(R.id.compassView); + attrView.setNextFocusLeftId(view.getId()); // add accessibility support setContentDescription(context.getString(R.string.mapbox_mapActionDescription)); diff --git a/platform/android/vendor/mapbox-events-android b/platform/android/vendor/mapbox-events-android -Subproject 58fbec16cdedb909eb63c68e46708fe9268b6fe +Subproject cfbbdff09e8d7d80222acc8e869a8e3afb4e44f diff --git a/platform/android/vendor/mapbox-gestures-android b/platform/android/vendor/mapbox-gestures-android -Subproject ae08de82ca178dca7f005dfc8056554cf77124a +Subproject 22910190e8374e1ad9494e9c98ffb027eafdd22 diff --git a/platform/android/vendor/mapbox-java b/platform/android/vendor/mapbox-java -Subproject 84de2d4b02e93a9eda9d0254332cd356d17445d +Subproject 305f6a78d1c1c4ec45735b0cf98bd7c4ea4658f diff --git a/platform/darwin/docs/theme b/platform/darwin/docs/theme -Subproject 75b9170a8b9f85d64f94e3083f8204edce10302 +Subproject 681c200620233b9bf7b5b22f7a15be417324f67 diff --git a/platform/ios/vendor/mapbox-events-ios b/platform/ios/vendor/mapbox-events-ios -Subproject 2e6bbd9f3c898f33a49e20fb97eca86eeb6351e +Subproject 021588900c1f76786a2f7f4c1c6b343aa2020d1 diff --git a/vendor/args b/vendor/args new file mode 160000 +Subproject f68b7e186cd2a020cbddfe3194c1d8ddfeeb101 diff --git a/vendor/boost b/vendor/boost -Subproject e822019d0f36fe43103cf4208d5cccea526a15b +Subproject 2499bc09829ad3bb913271f4b6889df8e4d692b diff --git a/vendor/earcut.hpp b/vendor/earcut.hpp -Subproject 0d0897a9dc462edf6396aedb335ddeb4aa302b7 +Subproject a3807695eb92d208643e15e112982b482ce36c9 diff --git a/vendor/geojson.hpp b/vendor/geojson.hpp new file mode 160000 +Subproject 97f81eadb66f985af4ce59c003bce8718654198 diff --git a/vendor/geometry.hpp b/vendor/geometry.hpp new file mode 160000 +Subproject c83a2ab18a225254f128b6f5115aa39d04f2de2 diff --git a/vendor/jni.hpp b/vendor/jni.hpp new file mode 160000 +Subproject 8f55acd9017452f45a88ab3fb3aef89de995b72 diff --git a/vendor/kdbush.hpp b/vendor/kdbush.hpp new file mode 160000 +Subproject bbbbf6030f46d28add4d8e1b1436b89af3ffb92 diff --git a/vendor/pixelmatch-cpp b/vendor/pixelmatch-cpp new file mode 160000 +Subproject 61f433cb485d6b08dc7fe97ae5f8717007c7bda diff --git a/vendor/rapidjson b/vendor/rapidjson new file mode 160000 +Subproject f54b0e47a08782a6131cc3d60f94d038fa6e0a5 diff --git a/vendor/supercluster.hpp b/vendor/supercluster.hpp new file mode 160000 +Subproject 274ec138306c7b110bf4dde47706aeb43dc8147 diff --git a/vendor/variant b/vendor/variant new file mode 160000 +Subproject cb02ad487e069e050e5db11b1e5e9ccbe269e2f |