Codename One - правильное использование addMarker (pin, координата) MapContainer (ВИДЕО) - PullRequest
0 голосов
/ 06 мая 2018

Этот вопрос относится к CN1Lib для Google Map .

Моя проблема в том, что метод addMarker(com.codename1.ui.Component marker, com.codename1.maps.Coord location) не работает должным образом на моем реальном устройстве Android 7, если я не использую вместе метод setCameraPosition(com.codename1.maps.Coord crd).

Чтобы быть более понятным, с помощью следующего кода я расширяю класс MapContainer: проблема в том, что я не могу удалить строку this.setCameraPosition(coordinate); без нарушения функциональности (если я удалю эту строку, то я не смогу добавить маркер в повернутая позиция).

Я не уверен, есть ли ошибка в моем коде или в CN1Lib.

public class MyMapContainer extends MapContainer {

    private Label pin;
    private Location markerLocation = new Location(0.0, 0.0);
    MapObject mapObject = null;

    /**
     * Constructor that creates a default pinVector to be used with
     * addMarker(Coord coordinate)
     */
    public MyMapContainer() {
        super();
        Style s = new Style();
        s.setFgColor(ColorUtil.BLACK);
        pin = new Label(FontImage.createMaterial(FontImage.MATERIAL_PLACE, s, 10));
    }

    /**
     * Constructor
     *
     * @param pinVector to be used with addMarker(Coord coordinate)
     */
    public MyMapContainer(Image pinVector) {
        this();
        if (pinVector != null) {
            pin = new Label(pinVector);
        }
    }

    /**
     * Adds a single marker (removes the previous one, if any)
     *
     * @param coordinate
     */
    public void addMarker(Coord coordinate) {
        if (mapObject != null) {
            pin.remove();
            this.removeMapObject(mapObject);
            Log.p("Marker removed");
        }
        mapObject = this.addMarker(pin, coordinate);
        this.setCameraPosition(coordinate);
        Log.p("Marker added to the coordinate: " + coordinate.toString());

        markerLocation.setLatitude(coordinate.getLatitude());
        markerLocation.setLongitude(coordinate.getLongitude());
    }

    /**
     * Returns the marker location
     *
     * @return markerLocation
     */
    public Location getMarkerLocation() {
        return markerLocation;
    }

}

Чтобы проверить этот расширенный класс, я написал следующий код в основном классе:

mapContainer.addMarker(initialCoordinate);
mapContainer.zoom(initialCoordinate, 18);
mapContainer.addTapListener(e -> {
    Coord userTappedCoord = mapContainer.getCoordAtPosition(e.getX(), e.getY());
    Log.p("userTappedCoord: " + userTappedCoord);
    mapContainer.addMarker(userTappedCoord);
});

--- ОБНОВЛЕНИЕ (как ответ на комментарий Шая)

Если заменить this.setCameraPosition на следующие строки ...

this.revalidate();
if (Display.getInstance().getCurrent() != null) {
    Display.getInstance().getCurrent().revalidate();
}
//this.setCameraPosition(coordinate);

... проблема та же: я не могу добавить новый маркер. Чтобы быть более понятным, пожалуйста, посмотрите это видео: https://www.informatica -libera.net / VID_20180507_113028.mp4

На видео белый кружок соответствует точке, где я касаюсь экрана. Я нажимаю на нее три раза (вы можете услышать щелчки мыши в видео), но маркер перемещается в случайную позицию после каждого нажатия, а затем возвращается в первую позицию. Это видео зарегистрировано в ферме устройств, но у меня такая же проблема с моим реальным устройством.

1 Ответ

0 голосов
/ 08 мая 2018

Я предполагаю, что это проблема:

pin.remove();
removeMapObject(mapObject);

Один из них работает неправильно, поэтому штифт сохраняет свое местоположение. Попробуйте сделать это вместо:

removeMapObject(mapObject);
pin.remove();

Если это не работает, проверьте тезис, создав новый экземпляр компонента, а не добавляя тот же самый компонент снова. Предполагая, что это решит проблему, пожалуйста, сообщите о проблеме с этими деталями здесь .

...