summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLangston Smith <langston.smith@mapbox.com>2019-05-27 19:05:24 -0700
committerlangsmith <langstonlmcs@gmail.com>2019-09-19 14:15:55 -0700
commitddf84d3fd28bd7ec0f6b69bbc8503b9b33d552ff (patch)
tree660a4f831f4009da1532a494cddbffeb74d3283a
parentd1459ec2272959b0bffa8ea73ae07f949ad386b1 (diff)
downloadqtlocation-mapboxgl-ddf84d3fd28bd7ec0f6b69bbc8503b9b33d552ff.tar.gz
[android] adding tilt logic when shift key is held down during up/down
m---------mapbox-gl-js0
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java84
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapKeyListener.java47
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java14
m---------platform/android/vendor/mapbox-events-android0
m---------platform/android/vendor/mapbox-gestures-android0
m---------platform/android/vendor/mapbox-java0
m---------platform/darwin/docs/theme0
m---------platform/ios/vendor/mapbox-events-ios0
m---------vendor/args0
m---------vendor/boost0
m---------vendor/earcut.hpp0
m---------vendor/geojson.hpp0
m---------vendor/geometry.hpp0
m---------vendor/jni.hpp0
m---------vendor/kdbush.hpp0
m---------vendor/pixelmatch-cpp0
m---------vendor/rapidjson0
m---------vendor/supercluster.hpp0
m---------vendor/variant0
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