From b3467a555ac48d34470210bab0c7172161b0540c Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Mon, 13 Jun 2016 14:11:18 +0200 Subject: [PATCH] [android] #4924 - Make Gesture Focal Point Configurable --- .../com/mapbox/mapboxsdk/maps/MapView.java | 68 ++++++++++++------- .../com/mapbox/mapboxsdk/maps/UiSettings.java | 23 +++++++ .../annotation/MarkerViewActivity.java | 3 + 3 files changed, 69 insertions(+), 25 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 658d67e7566..ae71ee384a3 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 @@ -152,6 +152,8 @@ public class MapView extends FrameLayout { private int mContentPaddingRight; private int mContentPaddingBottom; + private PointF mFocalPoint; + private StyleInitializer mStyleInitializer; private List mOnMapReadyCallbackList; @@ -566,6 +568,18 @@ public void onResume() { } } + void setFocalPoint(PointF focalPoint) { + if (focalPoint == null) { + // resetting focal point, + UiSettings uiSettings = mMapboxMap.getUiSettings(); + // need to validate if we need to reset focal point with user provided one + if (uiSettings.getFocalPoint() != null) { + focalPoint = uiSettings.getFocalPoint(); + } + } + mFocalPoint = focalPoint; + } + /** * You must call this method from the parent's {@link Activity#onLowMemory()} or {@link Fragment#onLowMemory()}. */ @@ -1548,8 +1562,12 @@ public boolean onTouchEvent(@NonNull MotionEvent event) { || mShoveGestureDetector.isInProgress(); if (mTwoTap && isTap && !inProgress) { - PointF focalPoint = TwoFingerGestureDetector.determineFocalPoint(event); - zoom(false, focalPoint.x, focalPoint.y); + if (mFocalPoint != null) { + zoom(false, mFocalPoint.x / mScreenDensity, mFocalPoint.y / mScreenDensity); + } else { + PointF focalPoint = TwoFingerGestureDetector.determineFocalPoint(event); + zoom(false, focalPoint.x, focalPoint.y); + } mTwoTap = false; return true; } @@ -1608,12 +1626,12 @@ public boolean onDoubleTapEvent(MotionEvent e) { } // Single finger double tap - if (mMapboxMap.getTrackingSettings().isLocationTrackingDisabled()) { + if (mFocalPoint != null) { + // User provided focal point + zoom(true, mFocalPoint.x, mFocalPoint.y); + } else { // Zoom in on gesture zoom(true, e.getX(), e.getY()); - } else { - // Zoom in on user location view - zoom(true, mMyLocationView.getCenterX(), mMyLocationView.getCenterY()); } break; } @@ -1839,23 +1857,18 @@ public boolean onScale(ScaleGestureDetector detector) { // Gesture is a quickzoom if there aren't two fingers mQuickZoom = !mTwoTap; - TrackingSettings trackingSettings = mMapboxMap.getTrackingSettings(); - // Scale the map - if (uiSettings.isScrollGesturesEnabled() && !mQuickZoom && trackingSettings.isLocationTrackingDisabled()) { + if (mFocalPoint != null) { + // arround user provided focal point + mNativeMapView.scaleBy(detector.getScaleFactor(), mFocalPoint.x / mScreenDensity, mFocalPoint.y / mScreenDensity); + } else if (mQuickZoom) { + // around center map + mNativeMapView.scaleBy(detector.getScaleFactor(), (getWidth() / 2) / mScreenDensity, (getHeight() / 2) / mScreenDensity); + } else { // around gesture mNativeMapView.scaleBy(detector.getScaleFactor(), detector.getFocusX() / mScreenDensity, detector.getFocusY() / mScreenDensity); - } else { - if (trackingSettings.isLocationTrackingDisabled()) { - // around center map - mNativeMapView.scaleBy(detector.getScaleFactor(), (getWidth() / 2) / mScreenDensity, (getHeight() / 2) / mScreenDensity); - } else { - // around user location view - float x = mMyLocationView.getX() + mMyLocationView.getWidth() / 2; - float y = mMyLocationView.getY() + mMyLocationView.getHeight() / 2; - mNativeMapView.scaleBy(detector.getScaleFactor(), x / mScreenDensity, y / mScreenDensity); - } } + return true; } } @@ -1925,16 +1938,14 @@ public boolean onRotate(RotateGestureDetector detector) { bearing += detector.getRotationDegreesDelta(); // Rotate the map - if (mMapboxMap.getTrackingSettings().isLocationTrackingDisabled()) { + if (mFocalPoint != null) { + // User provided focal point + mNativeMapView.setBearing(bearing, mFocalPoint.x / mScreenDensity, mFocalPoint.y / mScreenDensity); + } else { // around gesture mNativeMapView.setBearing(bearing, detector.getFocusX() / mScreenDensity, detector.getFocusY() / mScreenDensity); - } else { - // around center userlocation - float x = mMyLocationView.getX() + mMyLocationView.getWidth() / 2; - float y = mMyLocationView.getY() + mMyLocationView.getHeight() / 2; - mNativeMapView.setBearing(bearing, x / mScreenDensity, y / mScreenDensity); } return true; } @@ -2426,6 +2437,13 @@ void setMyLocationTrackingMode(@MyLocationTracking.Mode int myLocationTrackingMo mMapboxMap.setMyLocationEnabled(true); } mMyLocationView.setMyLocationTrackingMode(myLocationTrackingMode); + + if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { + setFocalPoint(new PointF(mMyLocationView.getCenterX(), mMyLocationView.getCenterY())); + } else { + setFocalPoint(null); + } + MapboxMap.OnMyLocationTrackingModeChangeListener listener = mMapboxMap.getOnMyLocationTrackingModeChangeListener(); if (listener != null) { listener.onMyLocationTrackingModeChange(myLocationTrackingMode); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java index 0a20d13b64d..4ce631fc3e6 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java @@ -1,7 +1,9 @@ package com.mapbox.mapboxsdk.maps; +import android.graphics.PointF; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.view.Gravity; import android.view.View; @@ -35,6 +37,8 @@ public class UiSettings { private boolean deselectMarkersOnTap = true; + private PointF focalPoint; + UiSettings(@NonNull MapView mapView) { this.mapView = mapView; this.compassSettings = new ViewSettings(); @@ -563,6 +567,25 @@ public void setAllGesturesEnabled(boolean enabled) { setZoomGesturesEnabled(enabled); } + /** + * Sets the focal point used as center for a gesture + * + * @param focalPoint the focal point to be used. + */ + public void setFocalPoint(@Nullable PointF focalPoint) { + this.focalPoint = focalPoint; + mapView.setFocalPoint(focalPoint); + } + + /** + * Returns the gesture focal point + * + * @return The focal point + */ + public PointF getFocalPoint() { + return focalPoint; + } + /** * Returns the measured height of the MapView * diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java index 19ae121e820..0f08c6ae869 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java @@ -5,6 +5,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; +import android.graphics.PointF; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; @@ -161,6 +162,8 @@ public boolean onMarkerClick(@NonNull Marker marker, @NonNull View view, @NonNul .icon(IconFactory.getInstance(mMapView.getContext()) .fromResource(R.drawable.ic_arsenal)) ); + + mMapboxMap.getUiSettings().setFocalPoint(new PointF(mMapView.getMeasuredWidth() / 2, mMapView.getMeasuredHeight() / 4)); } }); }