[android] added map touch listeners api based on lists
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user