Osmdroid MapEventsReceiver с маркером не работает

#android #marker #osmdroid

#Android #маркер #osmdroid

Вопрос:

Привет, я создаю фрагмент, когда добавляю MapEventsReceiver для определения типа фигуры (прямоугольник, многоугольник, линия, маркер и т.д.), Чтобы определить, нажата ли форма. Но у меня проблема с маркером, я не могу определить, когда нажимается маркер. Я добавляю всплывающее сообщение, когда нажимаю на карту (метод получения MapEventsReceiver longPressHelper ()), и когда я нажимаю на все фигуры, это работает идеально, но не в Marker (запускается метод onLongPress из класса marker). Можно ли добавить прослушиватель маркеров в longPressHelper из MapEventReceiver (я хочу определить, что в longPressHelper нажат маркер)?

Комментарии:

1. Это могло бы помочь вам получить больше и более качественных ответов, если бы вы включили простой фрагмент кода, где мы могли бы увидеть, как вы на самом деле обрабатываете слушателей. В этом нет необходимости, но это помогло бы нам узнать, что вы на самом деле делаете и как.

Ответ №1:

Проблема с Marker заключается в том, что он фактически обрабатывает длительное нажатие сам по себе и предотвращает его распространение.

Если вы проверите исходный код Marker

 @Override public boolean onLongPress(final MotionEvent event, final MapView mapView) {
        boolean touched = hitTest(event, mapView);
        if (touched){
            if (mDraggable){
                //starts dragging mode:
                mIsDragged = true;
                closeInfoWindow();
                if (mOnMarkerDragListener != null)
                    mOnMarkerDragListener.onMarkerDragStart(this);
                moveToEventPosition(event, mapView);
            }
        }
        return touched;
    }
  

Вы можете видеть, что при длительном нажатии на маркер метод возвращает true, а это означает, что событие касания не будет распространено ни на другие оверлеи, ни на MapView .

Однако, если вам не нужна функция перетаскивания маркера, вы можете самостоятельно расширить Marker класс и переопределить поведение:

 @Override public boolean onLongPress(final MotionEvent event, final MapView mapView) {
   return false;
}
  

Теперь, если вы используете свой производный класс, длительное нажатие должно распространяться на MapView .