Mapsforge прослушивает более одного маркера

Я слежу за библиотекой mapsforge уже некоторое время, и мне нравится, как она работает.

В моем проекте мне нужны разные типы маркеров. Один тип должен отображать диалоговое окно, касающееся маркера, при нажатии, а другой тип должен отображать координаты маркера при нажатии.

Поэтому я создаю два дочерних класса класса Marker, например, PoiMarker и LocationMarker, и, таким образом, переопределяю методы onTap() для обоих дочерних классов. Теперь, когда я добавляю первый маркер (PoiMarker), все хорошо, и отображается диалоговое окно. Затем, когда я добавляю второй маркер (LocationMarker), всплывающее уведомление также отображается, но когда я нажимаю на первый маркер, вместо диалогового окна отображается всплывающее уведомление. И везде, где я нажимаю на карту, вместо диалога отображается тост.

Я понимаю, что при добавлении маркера в представление карты мы добавляем слой в представление карты, и когда я добавляю другой маркер, новый слой просто перекрывает предыдущий маркер, и касание первого маркера никогда не встречается.

Как сделать первый маркер доступным для нажатия даже после добавления нового второго маркера?

Спасибо


person Yogesh    schedule 13.11.2015    source источник


Ответы (1)


Не нужно создавать несколько классов для нескольких типов маркеров, просто создайте новый класс, расширьте маркер, добавьте свойство markerType и переопределите onTap:

public class DescriptedMarker extends Marker {

public DescriptedMarker(LatLong latLong, Bitmap bitmap, int horizontalOffset, int verticalOffset) {
    super(latLong, bitmap, horizontalOffset, verticalOffset);
}

public String marker_description;
public int  marker_type;

private Runnable action;

public void setOnTabAction(Runnable action){

    this.action = action;
}
@Override
public boolean onTap(LatLong tapLatLong, Point layerXY, Point tapXY) {

    double centerX = layerXY.x + getHorizontalOffset();
    double centerY = layerXY.y + getVerticalOffset();

    double radiusX = (getBitmap().getWidth() / 2) *1.1;
    double radiusY = (getBitmap().getHeight() / 2) *1.1;


    double distX = Math.abs(centerX - tapXY.x);
    double distY = Math.abs(centerY - tapXY.y);


    if( distX < radiusX && distY < radiusY){

        if(action != null){
            action.run();
            return true;
        }
    }
    return false;
}
}

теперь вы можете легко создать несколько типов рынка:

org.mapsforge.core.graphics.Bitmap bmp = AndroidGraphicFactory.convertToBitmap(getResources().getDrawable(R.drawable.myMarkerDrawable));
//pos is a LatLong variable 
final DescriptedMarker marker = new DescriptedMarker(pos,bmp,0,0);  
marker.marker_type = x; //x is an int and determine marker type


   marker.setOnTabAction(new Runnable() {
       @Override
       public void run() {

           if(marker.marker_type == 0)
           Application.toast_short(marker.marker_description);
           else if(marker.marker_type == 1)
           {
               //display a dialog for example
           }// you can add many if for many types
       }
   });
person farhad.kargaran    schedule 08.08.2016