From 09d76854ab15b2a6f473c270da9d46e903e426da Mon Sep 17 00:00:00 2001 From: Tobrun Date: Fri, 17 Mar 2017 15:23:28 +0100 Subject: [android] - only dispatch events if not handled by MarkerView (#8447) use onTouch listener to ignore dispatching action up events to MapView when they are already handled by MarkerView. --- .../mapboxsdk/annotations/MarkerViewContainer.java | 10 ++++++--- .../mapboxsdk/annotations/MarkerViewManager.java | 26 +++++++++++++--------- .../activity/annotation/MarkerViewActivity.java | 7 ++++++ 3 files changed, 30 insertions(+), 13 deletions(-) (limited to 'platform') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewContainer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewContainer.java index 1f206b71ca..d590582f09 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewContainer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewContainer.java @@ -17,14 +17,18 @@ public class MarkerViewContainer extends FrameLayout { public MarkerViewContainer(Context context, AttributeSet attrs) { super(context, attrs); + setTag(false); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { - final boolean childResult = super.dispatchTouchEvent(ev); - if (childResult) { + super.dispatchTouchEvent(ev); + boolean actionUp = (boolean) getTag(); + if (!actionUp) { ((ViewGroup) getParent()).onTouchEvent(ev); + } else { + setTag(false); } - return childResult; + return true; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java index 9a721151f7..0f1298eeaf 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java @@ -8,6 +8,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.LongSparseArray; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -503,18 +504,23 @@ public class MarkerViewManager implements MapView.OnMapChangedListener { } } - adaptedView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - boolean clickHandled = false; - if (onMarkerViewClickListener != null) { - clickHandled = onMarkerViewClickListener.onMarkerClick(marker, v, adapter); - } + adaptedView.setOnTouchListener(new View.OnTouchListener() { - if (!clickHandled) { - ensureInfoWindowOffset(marker); - select(marker, v, adapter); + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + boolean clickHandled = false; + if (onMarkerViewClickListener != null) { + clickHandled = onMarkerViewClickListener.onMarkerClick(marker, v, adapter); + markerViewContainer.setTag(true); + } + + if (!clickHandled) { + ensureInfoWindowOffset(marker); + select(marker, v, adapter); + } } + return true; } }); 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 f2f82865d1..b8a008e592 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 @@ -196,6 +196,13 @@ public class MarkerViewActivity extends AppCompatActivity { // open infowindow offscreen markers mapboxMap.selectMarker(markerRightOffScreen); mapboxMap.selectMarker(markerRightBottomOffScreen); + + mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() { + @Override + public void onMapClick(@NonNull LatLng point) { + Toast.makeText(MarkerViewActivity.this, point.toString(), Toast.LENGTH_SHORT).show(); + } + }); } }); } -- cgit v1.2.1