[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.
This commit is contained in:
Tobrun
2017-03-17 15:23:28 +01:00
committed by GitHub
parent 2e6c0263d8
commit 09d76854ab
3 changed files with 30 additions and 13 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
});