From 6d3de25f735c18d6dcc5b3ca9f4d53f12e2c5e31 Mon Sep 17 00:00:00 2001 From: Bastien Wermeille Date: Mon, 3 Aug 2020 10:59:22 +0200 Subject: [PATCH] Upgrade mapView to manage multiple OnTouchListener --- .../com/mapbox/mapboxsdk/maps/MapView.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index c14590c20..dd671ffda 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -10,6 +10,7 @@ import android.view.MotionEvent; import android.view.TextureView; import android.view.View; +import android.view.View.OnTouchListener; import android.widget.FrameLayout; import android.widget.ImageView; @@ -65,6 +66,7 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback { private final MapChangeReceiver mapChangeReceiver = new MapChangeReceiver(); private final MapCallback mapCallback = new MapCallback(); private final InitialRenderCallback initialRenderCallback = new InitialRenderCallback(); + private final List onTouchListeners = new ArrayList<>(); @Nullable private NativeMap nativeMapView; @@ -464,6 +466,8 @@ public void onDestroy() { if (mapRenderer != null) { mapRenderer.onDestroy(); } + + onTouchListeners.clear(); } /** @@ -519,13 +523,38 @@ public View getRenderView() { return renderView; } + /** + * Add an OnTouchListener which will be call when an event occurs + * + * @param listener + * @return true if listener has been successfully registered + */ + public boolean addOnTouchListener(OnTouchListener listener) { + return onTouchListeners.add(listener); + } + + /** + * Remove an OnTouchListener previously registered + * + * @param listener + * @return true if listener has been successfully unregistered + */ + public boolean removeOnTouchListener(OnTouchListener listener) { + return onTouchListeners.remove(listener); + } + @Override public boolean onTouchEvent(MotionEvent event) { - if (!isGestureDetectorInitialized()) { - return super.onTouchEvent(event); + if (isGestureDetectorInitialized() && mapGestureDetector.onTouchEvent(event) || super.onTouchEvent(event)) { + return true; } - return mapGestureDetector.onTouchEvent(event) || super.onTouchEvent(event); + for (OnTouchListener listener : onTouchListeners) { + if (listener.onTouch(this, event) { + return true; + } + } + return false; } @Override