[android] added map touch listeners api based on lists

This commit is contained in:
paczos
2017-12-14 15:45:54 +01:00
committed by Tobrun
parent 9ed3aeaee1
commit 6b535f70ce
4 changed files with 372 additions and 36 deletions

View File

@@ -26,6 +26,8 @@ import com.mapbox.services.android.telemetry.MapboxTelemetry;
import com.mapbox.services.android.telemetry.utils.MathUtils;
import com.mapbox.services.android.telemetry.utils.TelemetryUtils;
import java.util.concurrent.CopyOnWriteArrayList;
import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE;
/**
@@ -43,16 +45,30 @@ final class MapGestureDetector {
private final AnnotationManager annotationManager;
private final CameraChangeDispatcher cameraChangeDispatcher;
private final GestureDetectorCompat gestureDetector;
private final ScaleGestureDetector scaleGestureDetector;
private final RotateGestureDetector rotateGestureDetector;
private final ShoveGestureDetector shoveGestureDetector;
private GestureDetectorCompat gestureDetector;
private ScaleGestureDetector scaleGestureDetector;
private RotateGestureDetector rotateGestureDetector;
private ShoveGestureDetector shoveGestureDetector;
// deprecated map touch API
private MapboxMap.OnMapClickListener onMapClickListener;
private MapboxMap.OnMapLongClickListener onMapLongClickListener;
private MapboxMap.OnFlingListener onFlingListener;
private MapboxMap.OnScrollListener onScrollListener;
// new map touch API
private final CopyOnWriteArrayList<MapboxMap.OnMapClickListener> onMapClickListenerList
= new CopyOnWriteArrayList<>();
private final CopyOnWriteArrayList<MapboxMap.OnMapLongClickListener> onMapLongClickListenerList
= new CopyOnWriteArrayList<>();
private final CopyOnWriteArrayList<MapboxMap.OnFlingListener> onFlingListenerList
= new CopyOnWriteArrayList<>();
private final CopyOnWriteArrayList<MapboxMap.OnScrollListener> onScrollListenerList
= new CopyOnWriteArrayList<>();
private PointF focalPoint;
private boolean twoTap;
@@ -81,12 +97,14 @@ final class MapGestureDetector {
this.cameraChangeDispatcher = cameraChangeDispatcher;
// Touch gesture detectors
gestureDetector = new GestureDetectorCompat(context, new GestureListener());
gestureDetector.setIsLongpressEnabled(true);
scaleGestureDetector = new ScaleGestureDetector(context, new ScaleGestureListener());
ScaleGestureDetectorCompat.setQuickScaleEnabled(scaleGestureDetector, true);
rotateGestureDetector = new RotateGestureDetector(context, new RotateGestureListener());
shoveGestureDetector = new ShoveGestureDetector(context, new ShoveGestureListener());
if (context != null) {
gestureDetector = new GestureDetectorCompat(context, new GestureListener());
gestureDetector.setIsLongpressEnabled(true);
scaleGestureDetector = new ScaleGestureDetector(context, new ScaleGestureListener());
ScaleGestureDetectorCompat.setQuickScaleEnabled(scaleGestureDetector, true);
rotateGestureDetector = new RotateGestureDetector(context, new RotateGestureListener());
shoveGestureDetector = new ShoveGestureDetector(context, new ShoveGestureListener());
}
}
/**
@@ -287,7 +305,6 @@ final class MapGestureDetector {
return false;
}
/**
* Responsible for handling one finger gestures.
*/
@@ -355,10 +372,7 @@ final class MapGestureDetector {
annotationManager.deselectMarkers();
}
// notify app of map click
if (onMapClickListener != null) {
onMapClickListener.onMapClick(projection.fromScreenLocation(tapPoint));
}
notifyOnMapClickListeners(tapPoint);
}
MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapClickEvent(
@@ -370,9 +384,10 @@ final class MapGestureDetector {
@Override
public void onLongPress(MotionEvent motionEvent) {
if (onMapLongClickListener != null && !quickZoom) {
onMapLongClickListener.onMapLongClick(
projection.fromScreenLocation(new PointF(motionEvent.getX(), motionEvent.getY())));
PointF longClickPoint = new PointF(motionEvent.getX(), motionEvent.getY());
if (!quickZoom) {
notifyOnMapLongClickListeners(longClickPoint);
}
}
@@ -412,9 +427,7 @@ final class MapGestureDetector {
// update transformation
transform.moveBy(offsetX, offsetY, animationTime);
if (onFlingListener != null) {
onFlingListener.onFling();
}
notifyOnFlingListeners();
return true;
}
@@ -449,13 +462,59 @@ final class MapGestureDetector {
// Scroll the map
transform.moveBy(-distanceX, -distanceY, 0 /*no duration*/);
if (onScrollListener != null) {
onScrollListener.onScroll();
}
notifyOnScrollListeners();
return true;
}
}
void notifyOnMapClickListeners(PointF tapPoint) {
// deprecated API
if (onMapClickListener != null) {
onMapClickListener.onMapClick(projection.fromScreenLocation(tapPoint));
}
// new API
for (MapboxMap.OnMapClickListener listener : onMapClickListenerList) {
listener.onMapClick(projection.fromScreenLocation(tapPoint));
}
}
void notifyOnMapLongClickListeners(PointF longClickPoint) {
// deprecated API
if (onMapLongClickListener != null) {
onMapLongClickListener.onMapLongClick(projection.fromScreenLocation(longClickPoint));
}
// new API
for (MapboxMap.OnMapLongClickListener listener : onMapLongClickListenerList) {
listener.onMapLongClick(projection.fromScreenLocation(longClickPoint));
}
}
void notifyOnFlingListeners() {
// deprecated API
if (onFlingListener != null) {
onFlingListener.onFling();
}
// new API
for (MapboxMap.OnFlingListener listener : onFlingListenerList) {
listener.onFling();
}
}
void notifyOnScrollListeners() {
//deprecated API
if (onScrollListener != null) {
onScrollListener.onScroll();
}
// new API
for (MapboxMap.OnScrollListener listener : onScrollListenerList) {
listener.onScroll();
}
}
/**
* Responsible for handling two finger gestures and double-tap drag gestures.
*/
@@ -844,4 +903,36 @@ final class MapGestureDetector {
void setOnScrollListener(MapboxMap.OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
}
void addOnMapClickListener(MapboxMap.OnMapClickListener onMapClickListener) {
onMapClickListenerList.add(onMapClickListener);
}
void removeOnMapClickListener(MapboxMap.OnMapClickListener onMapClickListener) {
onMapClickListenerList.remove(onMapClickListener);
}
void addOnMapLongClickListener(MapboxMap.OnMapLongClickListener onMapLongClickListener) {
onMapLongClickListenerList.add(onMapLongClickListener);
}
void removeOnMapLongClickListener(MapboxMap.OnMapLongClickListener onMapLongClickListener) {
onMapLongClickListenerList.remove(onMapLongClickListener);
}
void addOnFlingListener(MapboxMap.OnFlingListener onFlingListener) {
onFlingListenerList.add(onFlingListener);
}
void removeOnFlingListener(MapboxMap.OnFlingListener onFlingListener) {
onFlingListenerList.remove(onFlingListener);
}
void addOnScrollListener(MapboxMap.OnScrollListener onScrollListener) {
onScrollListenerList.add(onScrollListener);
}
void removeOnScrollListener(MapboxMap.OnScrollListener onScrollListener) {
onScrollListenerList.remove(onScrollListener);
}
}

View File

@@ -908,24 +908,64 @@ public class MapView extends FrameLayout {
private class RegisterTouchListener implements MapboxMap.OnRegisterTouchListener {
@Override
public void onRegisterMapClickListener(MapboxMap.OnMapClickListener listener) {
public void onSetMapClickListener(MapboxMap.OnMapClickListener listener) {
mapGestureDetector.setOnMapClickListener(listener);
}
@Override
public void onRegisterMapLongClickListener(MapboxMap.OnMapLongClickListener listener) {
public void onAddMapClickListener(MapboxMap.OnMapClickListener listener) {
mapGestureDetector.addOnMapClickListener(listener);
}
@Override
public void onRemoveMapClickListener(MapboxMap.OnMapClickListener listener) {
mapGestureDetector.removeOnMapClickListener(listener);
}
@Override
public void onSetMapLongClickListener(MapboxMap.OnMapLongClickListener listener) {
mapGestureDetector.setOnMapLongClickListener(listener);
}
@Override
public void onRegisterScrollListener(MapboxMap.OnScrollListener listener) {
public void onAddMapLongClickListener(MapboxMap.OnMapLongClickListener listener) {
mapGestureDetector.addOnMapLongClickListener(listener);
}
@Override
public void onRemoveMapLongClickListener(MapboxMap.OnMapLongClickListener listener) {
mapGestureDetector.removeOnMapLongClickListener(listener);
}
@Override
public void onSetScrollListener(MapboxMap.OnScrollListener listener) {
mapGestureDetector.setOnScrollListener(listener);
}
@Override
public void onRegisterFlingListener(MapboxMap.OnFlingListener listener) {
public void onAddScrollListener(MapboxMap.OnScrollListener listener) {
mapGestureDetector.addOnScrollListener(listener);
}
@Override
public void onRemoveScrollListener(MapboxMap.OnScrollListener listener) {
mapGestureDetector.removeOnScrollListener(listener);
}
@Override
public void onSetFlingListener(MapboxMap.OnFlingListener listener) {
mapGestureDetector.setOnFlingListener(listener);
}
@Override
public void onAddFlingListener(MapboxMap.OnFlingListener listener) {
mapGestureDetector.addOnFlingListener(listener);
}
@Override
public void onRemoveFlingListener(MapboxMap.OnFlingListener listener) {
mapGestureDetector.removeOnFlingListener(listener);
}
}
private static class MapZoomControllerListener implements ZoomButtonsController.OnZoomListener {

View File

@@ -1897,9 +1897,34 @@ public final class MapboxMap {
*
* @param listener The callback that's invoked when the map is scrolled.
* To unset the callback, use null.
*
* @deprecated Use {@link #addOnScrollListener(OnScrollListener)} instead.
*/
@Deprecated
public void setOnScrollListener(@Nullable OnScrollListener listener) {
onRegisterTouchListener.onRegisterScrollListener(listener);
onRegisterTouchListener.onSetScrollListener(listener);
}
/**
* Adds a callback that's invoked when the map is scrolled.
*
* @param listener The callback that's invoked when the map is scrolled.
* To unset the callback, use null.
*
*/
public void addOnScrollListener(@Nullable OnScrollListener listener) {
onRegisterTouchListener.onAddScrollListener(listener);
}
/**
* Removes a callback that's invoked when the map is scrolled.
*
* @param listener The callback that's invoked when the map is scrolled.
* To unset the callback, use null.
*
*/
public void removeOnScrollListener(@Nullable OnScrollListener listener) {
onRegisterTouchListener.onRemoveScrollListener(listener);
}
/**
@@ -1907,9 +1932,32 @@ public final class MapboxMap {
*
* @param listener The callback that's invoked when the map is flinged.
* To unset the callback, use null.
*
* @deprecated Use {@link #addOnFlingListener(OnFlingListener)} instead.
*/
@Deprecated
public void setOnFlingListener(@Nullable OnFlingListener listener) {
onRegisterTouchListener.onRegisterFlingListener(listener);
onRegisterTouchListener.onSetFlingListener(listener);
}
/**
* Adds a callback that's invoked when the map is flinged.
*
* @param listener The callback that's invoked when the map is flinged.
* To unset the callback, use null.
*/
public void addOnFlingListener(@Nullable OnFlingListener listener) {
onRegisterTouchListener.onAddFlingListener(listener);
}
/**
* Removes a callback that's invoked when the map is flinged.
*
* @param listener The callback that's invoked when the map is flinged.
* To unset the callback, use null.
*/
public void removeOnFlingListener(@Nullable OnFlingListener listener) {
onRegisterTouchListener.onRemoveFlingListener(listener);
}
/**
@@ -1917,9 +1965,32 @@ public final class MapboxMap {
*
* @param listener The callback that's invoked when the user clicks on the map view.
* To unset the callback, use null.
*
* @deprecated Use {@link #addOnMapClickListener(OnMapClickListener)} instead.
*/
@Deprecated
public void setOnMapClickListener(@Nullable OnMapClickListener listener) {
onRegisterTouchListener.onRegisterMapClickListener(listener);
onRegisterTouchListener.onSetMapClickListener(listener);
}
/**
* Adds a callback that's invoked when the user clicks on the map view.
*
* @param listener The callback that's invoked when the user clicks on the map view.
* To unset the callback, use null.
*/
public void addOnMapClickListener(@Nullable OnMapClickListener listener) {
onRegisterTouchListener.onAddMapClickListener(listener);
}
/**
* Removes a callback that's invoked when the user clicks on the map view.
*
* @param listener The callback that's invoked when the user clicks on the map view.
* To unset the callback, use null.
*/
public void removeOnMapClickListener(@Nullable OnMapClickListener listener) {
onRegisterTouchListener.onRemoveMapClickListener(listener);
}
/**
@@ -1927,9 +1998,32 @@ public final class MapboxMap {
*
* @param listener The callback that's invoked when the user long clicks on the map view.
* To unset the callback, use null.
*
* @deprecated Use {@link #addOnMapLongClickListener(OnMapLongClickListener)} instead.
*/
@Deprecated
public void setOnMapLongClickListener(@Nullable OnMapLongClickListener listener) {
onRegisterTouchListener.onRegisterMapLongClickListener(listener);
onRegisterTouchListener.onSetMapLongClickListener(listener);
}
/**
* Adds a callback that's invoked when the user long clicks on the map view.
*
* @param listener The callback that's invoked when the user long clicks on the map view.
* To unset the callback, use null.
*/
public void addOnMapLongClickListener(@Nullable OnMapLongClickListener listener) {
onRegisterTouchListener.onAddMapLongClickListener(listener);
}
/**
* Removes a callback that's invoked when the user long clicks on the map view.
*
* @param listener The callback that's invoked when the user long clicks on the map view.
* To unset the callback, use null.
*/
public void removeOnMapLongClickListener(@Nullable OnMapLongClickListener listener) {
onRegisterTouchListener.onRemoveMapLongClickListener(listener);
}
/**
@@ -2299,13 +2393,29 @@ public final class MapboxMap {
* related to touch and click events.
*/
interface OnRegisterTouchListener {
void onRegisterMapClickListener(OnMapClickListener listener);
void onSetMapClickListener(OnMapClickListener listener);
void onRegisterMapLongClickListener(OnMapLongClickListener listener);
void onAddMapClickListener(OnMapClickListener listener);
void onRegisterScrollListener(OnScrollListener listener);
void onRemoveMapClickListener(OnMapClickListener listener);
void onRegisterFlingListener(OnFlingListener listener);
void onSetMapLongClickListener(OnMapLongClickListener listener);
void onAddMapLongClickListener(OnMapLongClickListener listener);
void onRemoveMapLongClickListener(OnMapLongClickListener listener);
void onSetScrollListener(OnScrollListener listener);
void onAddScrollListener(OnScrollListener listener);
void onRemoveScrollListener(OnScrollListener listener);
void onSetFlingListener(OnFlingListener listener);
void onAddFlingListener(OnFlingListener listener);
void onRemoveFlingListener(OnFlingListener listener);
}
/**