summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Guardiola <guardiola31337@gmail.com>2017-02-09 14:33:24 +0100
committerGitHub <noreply@github.com>2017-02-09 14:33:24 +0100
commitdfb3c34837ca6b59ebafd7f03dfe3cf23a7955ea (patch)
tree4063a76b444bca49c941847162e0dd00ad1ed703
parent5f28bdc6999ca25013b6b855f5df9a6db9e1e248 (diff)
downloadqtlocation-mapboxgl-dfb3c34837ca6b59ebafd7f03dfe3cf23a7955ea.tar.gz
Compass click rotates around focal point (if available) (#7977)
* add set bearing method taking focal point into account * notify CompassView when FocalPoint changes
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java11
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java15
-rwxr-xr-xplatform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java10
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java7
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java25
-rwxr-xr-xplatform/android/src/jni.cpp9
6 files changed, 73 insertions, 4 deletions
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 fd4c8945ed..edff9b036d 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
@@ -127,7 +127,7 @@ public class MapView extends FrameLayout {
nativeMapView = new NativeMapView(this);
// callback for focal point invalidation
- FocalPointInvalidator focalPoint = new FocalPointInvalidator();
+ FocalPointInvalidator focalPoint = new FocalPointInvalidator(compassView);
// callback for registering touch listeners
RegisterTouchListener registerTouchListener = new RegisterTouchListener();
@@ -944,9 +944,18 @@ public class MapView extends FrameLayout {
private class FocalPointInvalidator implements FocalPointChangeListener {
+ private final FocalPointChangeListener[] focalPointChangeListeners;
+
+ FocalPointInvalidator(FocalPointChangeListener... listeners) {
+ focalPointChangeListeners = listeners;
+ }
+
@Override
public void onFocalPointChanged(PointF pointF) {
mapGestureDetector.setFocalPoint(pointF);
+ for (FocalPointChangeListener focalPointChangeListener : focalPointChangeListeners) {
+ focalPointChangeListener.onFocalPointChanged(pointF);
+ }
}
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
index a111c3046a..69a95457b8 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
@@ -738,6 +738,21 @@ public final class MapboxMap {
transform.resetNorth();
}
+ /**
+ * Set focal bearing.
+ */
+ public void setFocalBearing(double bearing, float focalX, float focalY, long duration) {
+ transform.setBearing(bearing, focalX, focalY, duration);
+ }
+
+ public float getHeight() {
+ return nativeMapView.getHeight();
+ }
+
+ public float getWidth() {
+ return nativeMapView.getWidth();
+ }
+
//
// Debug
//
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
index a425144919..1d260cacf3 100755
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
@@ -530,6 +530,13 @@ final class NativeMapView {
nativeSetBearingXY(nativeMapViewPtr, degrees, cx / pixelRatio, cy / pixelRatio);
}
+ public void setBearing(double degrees, double fx, double fy, long duration) {
+ if (isDestroyedOn("setBearing")) {
+ return;
+ }
+ nativeSetFocalBearing(nativeMapViewPtr, degrees, fx / pixelRatio, fy / pixelRatio, duration);
+ }
+
public double getBearing() {
if (isDestroyedOn("getBearing")) {
return 0;
@@ -1047,6 +1054,9 @@ final class NativeMapView {
private native void nativeSetBearingXY(long nativeMapViewPtr, double degrees,
double cx, double cy);
+ private native void nativeSetFocalBearing(long nativeMapViewPtr, double degrees,
+ double fx, double fy, long duration);
+
private native double nativeGetBearing(long nativeMapViewPtr);
private native void nativeResetNorth(long nativeMapViewPtr);
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java
index 2add46e7e7..97170ca3d4 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java
@@ -220,6 +220,13 @@ final class Transform implements MapView.OnMapChangedListener {
mapView.setBearing(bearing, focalX, focalY);
}
+ void setBearing(double bearing, float focalX, float focalY, long duration) {
+ if (myLocationView != null) {
+ myLocationView.setBearing(bearing);
+ }
+ mapView.setBearing(bearing, focalX, focalY, duration);
+ }
+
//
// LatLng / CenterCoordinate
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java
index dc4a21f2fe..ed6ef5199a 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/CompassView.java
@@ -1,17 +1,20 @@
package com.mapbox.mapboxsdk.maps.widgets;
import android.content.Context;
+import android.graphics.PointF;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorCompat;
import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
+import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ImageView;
import com.mapbox.mapboxsdk.R;
+import com.mapbox.mapboxsdk.maps.FocalPointChangeListener;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import java.lang.ref.WeakReference;
@@ -25,7 +28,7 @@ import java.lang.ref.WeakReference;
* use {@link com.mapbox.mapboxsdk.maps.UiSettings}.
* </p>
*/
-public final class CompassView extends ImageView implements Runnable {
+public final class CompassView extends AppCompatImageView implements Runnable, FocalPointChangeListener {
private static final long TIME_WAIT_IDLE = 500;
private static final long TIME_FADE_ANIMATION = TIME_WAIT_IDLE;
@@ -34,6 +37,7 @@ public final class CompassView extends ImageView implements Runnable {
private double direction = 0.0;
private boolean fadeCompassViewFacingNorth = true;
private ViewPropertyAnimatorCompat fadeAnimator;
+ private PointF focalPoint;
public CompassView(Context context) {
super(context);
@@ -96,6 +100,11 @@ public final class CompassView extends ImageView implements Runnable {
}
}
+ @Nullable
+ PointF getFocalPoint() {
+ return focalPoint;
+ }
+
public void update(final double direction) {
this.direction = direction;
@@ -143,6 +152,11 @@ public final class CompassView extends ImageView implements Runnable {
}
}
+ @Override
+ public void onFocalPointChanged(PointF pointF) {
+ focalPoint = pointF;
+ }
+
static class CompassClickListener implements View.OnClickListener {
private WeakReference<MapboxMap> mapboxMap;
@@ -158,7 +172,12 @@ public final class CompassView extends ImageView implements Runnable {
final MapboxMap mapboxMap = this.mapboxMap.get();
final CompassView compassView = this.compassView.get();
if (mapboxMap != null && compassView != null) {
- mapboxMap.resetNorth();
+ PointF focalPoint = compassView.getFocalPoint();
+ if (focalPoint != null) {
+ mapboxMap.setFocalBearing(0, focalPoint.x, focalPoint.y, TIME_MAP_NORTH_ANIMATION);
+ } else {
+ mapboxMap.setFocalBearing(0, mapboxMap.getWidth() / 2, mapboxMap.getHeight() / 2, TIME_MAP_NORTH_ANIMATION);
+ }
compassView.postDelayed(compassView, TIME_WAIT_IDLE + TIME_MAP_NORTH_ANIMATION);
}
}
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index f273210c77..31fe2394f5 100755
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -618,6 +618,14 @@ void nativeSetBearing(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jd
nativeMapView->getMap().setBearing(degrees, duration);
}
+void nativeSetFocalBearing(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdouble degrees, jdouble fx,
+ jdouble fy, jlong milliseconds) {
+ assert(nativeMapViewPtr != 0);
+ NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
+ mbgl::ScreenCoordinate center(fx, fy);
+ nativeMapView->getMap().setBearing(degrees, center, mbgl::Milliseconds(milliseconds));
+}
+
void nativeSetBearingXY(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdouble degrees,
jdouble cx, jdouble cy) {
assert(nativeMapViewPtr != 0);
@@ -1894,6 +1902,7 @@ void registerNatives(JavaVM *vm) {
MAKE_NATIVE_METHOD(nativeSetMaxZoom, "(JD)V"),
MAKE_NATIVE_METHOD(nativeRotateBy, "(JDDDDJ)V"),
MAKE_NATIVE_METHOD(nativeSetBearing, "(JDJ)V"),
+ MAKE_NATIVE_METHOD(nativeSetFocalBearing, "(JDDDJ)V"),
MAKE_NATIVE_METHOD(nativeSetBearingXY, "(JDDD)V"),
MAKE_NATIVE_METHOD(nativeGetBearing, "(J)D"),
MAKE_NATIVE_METHOD(nativeResetNorth, "(J)V"),