Android 单击MapPoint时显示胶子贴图的工具提示

Android 单击MapPoint时显示胶子贴图的工具提示,android,javafxports,Android,Javafxports,在地图点中执行onclick()操作时,是否可以显示弹出窗口,并且当您正确更改缩放位置时,是否有人成功? 使用的库是gluonmaps 我希望在单击贴图点时显示工具提示,当我更改缩放时,贴图点将移动到其正确位置,在示例中,缩放时它不会定位 MapPoint point = candidate.getKey(); Node icon = candidate.getValue(); Point2D mapPoint = baseMap.getMapPoint(point.getLatitude(),

在地图点中执行
onclick()
操作时,是否可以显示
弹出窗口
,并且当您正确更改缩放位置时,是否有人成功? 使用的库是gluon
maps

我希望在单击贴图点时显示工具提示,当我更改缩放时,贴图点将移动到其正确位置,在示例中,缩放时它不会定位

MapPoint point = candidate.getKey();
Node icon = candidate.getValue();
Point2D mapPoint = baseMap.getMapPoint(point.getLatitude(), point.getLongitude());
icon.setVisible(true);
icon.setTranslateX(mapPoint.getX());
icon.setTranslateY(mapPoint.getY());
final Tooltip tp=new Tooltip();
icon.setOnMouseClicked(new EventHandler<MouseEvent>() {
     @Override
     public void handle(MouseEvent t) {
         tp.setText("Pruebas");
         com.sun.glass.ui.Robot robot = com.sun.glass.ui.Application
                    .GetApplication().createRobot();
         tp.show(icon, robot.getMouseX() + 10,
                    robot.getMouseY() + 10);
        }
    });
    icon.setOnMouseExited(new EventHandler<MouseEvent>() {
         @Override
         public void handle(MouseEvent t) {

            //tp.hide();
        }
    });
MapPoint=candidate.getKey();
节点图标=candidate.getValue();
Point2D mapPoint=baseMap.getMapPoint(point.getLatitude(),point.getLength());
icon.setVisible(true);
icon.setTranslateX(mapPoint.getX());
icon.setTranslateY(mapPoint.getY());
最终工具提示tp=新工具提示();
icon.setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
tp.setText(“Pruebas”);
com.sun.glass.ui.Robot Robot=com.sun.glass.ui.Application
.GetApplication().createRobot();
tp.show(图标,robot.getMouseX()+10,
robot.getMouseY()+10);
}
});
icon.setOnMouseExited(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
//tp.hide();
}
});

是否可以像点一样更改位置工具提示,在缩放时位置点会发生更改?有人尝试过?

因为您在胶子图的演示中引用了
poilyer
类,所以您可以轻松地将其修改为:

  • 单击地图的一个位置时,相应地更新图标位置,而无需缩放更新

  • 在图标上显示工具提示

只需将此方法添加到
PoiLayer
即可将给定点更新为新的
lat
lon
坐标:

public void updatePoint(MapPoint p, double lat, double lon) {
    for (Pair<MapPoint, Node> candidate : points) {
        MapPoint point = candidate.getKey();
        if (point.equals(p)) {
            p.update(lat, lon);
            markDirty();
            break;
        }
    }
}
唯一缺少的部分是从场景中获取纬度和经度坐标。这就涵盖了这一点

基于此,您可以将此方法添加到
PoiLayer
类中:

public MapPoint getMapPosition(double x, double y) {
    double z = baseMap.zoom().get();
    double latrad = Math.PI - (2 * Math.PI * (y - baseMap.getTranslateY())) / (Math.pow(2, z) * 256.0);
    double mlat = Math.toDegrees(Math.atan(Math.sinh(latrad)));
    double mlon = (x - this.baseMap.getTranslateX()) / (256.0 * Math.pow(2, z)) * 360.0 - 180.0;
    return new MapPoint(mlat, mlon);
}
public void addPoint(MapPoint p, Node icon) {
    final Pair<MapPoint, Node>  pair = new Pair(p, icon);
    icon.setOnMouseClicked(e -> {
        e.consume();
        showPopup(pair);
    });
    points.add(pair);
    this.getChildren().add(icon);
    this.markDirty();
}

private void showPopup(Pair<MapPoint, Node>  pair) {
    Node icon = pair.getValue();
    MapPoint point = pair.getKey();
    final Stage primaryStage = (Stage) icon.getScene().getWindow();
    final Stage popupStage = new Stage();
    popupStage.initStyle(StageStyle.UNDECORATED);
    popupStage.initModality(Modality.APPLICATION_MODAL);
    popupStage.initOwner(primaryStage);

    VBox box = new VBox(5);
    box.setPadding(new Insets(5));
    box.getChildren().addAll(new Label("Popup"),
            new Label("Lat: " + String.format("%2.6fº", point.getLatitude())),
            new Label("Lon: " + String.format("%2.6fº", point.getLongitude())));
    Label close = new Label("X");
    close.setOnMouseClicked(a -> popupStage.close());

    StackPane.setAlignment(close, Pos.TOP_RIGHT);
    final StackPane stackPane = new StackPane(box, close);
    stackPane.setPadding(new Insets(5));
    stackPane.setStyle("-fx-background-color: lightgreen;");

    Scene scene = new Scene(stackPane, 150, 100);
    Bounds iconBounds = icon.localToScene(icon.getBoundsInLocal());
    popupStage.setX(primaryStage.getX() + primaryStage.getScene().getX() + iconBounds.getMaxX() );
    popupStage.setY(primaryStage.getY() + primaryStage.getScene().getY() + iconBounds.getMaxY());
    popupStage.setScene(scene);
    popupStage.show();
}
最后,将侦听器添加到视图中:

@Override
public void start(Stage stage) throws Exception {
    MapView view = new MapView();
    PoiLayer myDemoLayer = createDemoLayer();
    view.setZoom(4); 
    view.addLayer(myDemoLayer);
    Scene scene = new Scene(view, 600, 700);
    stage.setScene(scene);
    stage.show();

    view.flyTo(0, mapPointIcon, 1.);

    view.setOnMouseClicked(e -> {
        MapPoint position = myDemoLayer.getMapPosition(e.getX(), e.getY());
        myDemoLayer.updatePoint(mapPointIcon, position.getLatitude(), position.getLongitude());
    });
}
这很好,但如果您有一个包含多个点的图层,则需要一种方法来选择要移动的点

编辑

这是一个非常简单的弹出式实现,它基于一个永久性弹出窗口而不是工具提示的OP请求。为了获得更好的解决方案,建议使用
PopOver
控件

这可以添加到
PoiLayer
类中:

public MapPoint getMapPosition(double x, double y) {
    double z = baseMap.zoom().get();
    double latrad = Math.PI - (2 * Math.PI * (y - baseMap.getTranslateY())) / (Math.pow(2, z) * 256.0);
    double mlat = Math.toDegrees(Math.atan(Math.sinh(latrad)));
    double mlon = (x - this.baseMap.getTranslateX()) / (256.0 * Math.pow(2, z)) * 360.0 - 180.0;
    return new MapPoint(mlat, mlon);
}
public void addPoint(MapPoint p, Node icon) {
    final Pair<MapPoint, Node>  pair = new Pair(p, icon);
    icon.setOnMouseClicked(e -> {
        e.consume();
        showPopup(pair);
    });
    points.add(pair);
    this.getChildren().add(icon);
    this.markDirty();
}

private void showPopup(Pair<MapPoint, Node>  pair) {
    Node icon = pair.getValue();
    MapPoint point = pair.getKey();
    final Stage primaryStage = (Stage) icon.getScene().getWindow();
    final Stage popupStage = new Stage();
    popupStage.initStyle(StageStyle.UNDECORATED);
    popupStage.initModality(Modality.APPLICATION_MODAL);
    popupStage.initOwner(primaryStage);

    VBox box = new VBox(5);
    box.setPadding(new Insets(5));
    box.getChildren().addAll(new Label("Popup"),
            new Label("Lat: " + String.format("%2.6fº", point.getLatitude())),
            new Label("Lon: " + String.format("%2.6fº", point.getLongitude())));
    Label close = new Label("X");
    close.setOnMouseClicked(a -> popupStage.close());

    StackPane.setAlignment(close, Pos.TOP_RIGHT);
    final StackPane stackPane = new StackPane(box, close);
    stackPane.setPadding(new Insets(5));
    stackPane.setStyle("-fx-background-color: lightgreen;");

    Scene scene = new Scene(stackPane, 150, 100);
    Bounds iconBounds = icon.localToScene(icon.getBoundsInLocal());
    popupStage.setX(primaryStage.getX() + primaryStage.getScene().getX() + iconBounds.getMaxX() );
    popupStage.setY(primaryStage.getY() + primaryStage.getScene().getY() + iconBounds.getMaxY());
    popupStage.setScene(scene);
    popupStage.show();
}
public void addPoint(映射点p,节点图标){
最终配对=新配对(p,图标);
图标。设置鼠标点击(e->{
e、 消费();
showPopup(成对);
});
点。添加(对);
this.getChildren().add(图标);
这个.markDirty();
}
私有void显示弹出窗口(成对){
节点图标=pair.getValue();
MapPoint=pair.getKey();
最终阶段primaryStage=(阶段)icon.getScene().getWindow();
最后阶段popupStage=新阶段();
Popustage.initStyle(舞台风格。未装饰);
popupStage.initmodal(MODAL.APPLICATION_MODAL);
popupStage.initOwner(primaryStage);
VBox框=新的VBox(5);
框。设置填充(新插图(5));
box.getChildren().addAll(新标签(“弹出”),
新标签(“Lat:+String.format(“%2.6fº”,point.getLatitude()),
新标签(“Lon:+String.format”(%2.6fº),point.getLongitude());
标签关闭=新标签(“X”);
close.setOnMouseClicked(a->popupStage.close());
StackPane.setAlignment(关闭,右上方位置);
最终StackPane StackPane=新的StackPane(框,关闭);
stackPane.setPadding(新插图(5));
stackPane.setStyle(“-fx背景色:浅绿色;”);
场景=新场景(stackPane,150100);
Bounds iconBounds=icon.localToScene(icon.getBoundsInLocal());
setX(primaryStage.getX()+primaryStage.getScene().getX()+iconBounds.getMaxX());
setY(primaryStage.getY()+primaryStage.getScene().getY()+iconBounds.getMaxY());
popupStage.setScene(场景);
popustage.show();
}
无论何时单击图标,都会显示一个模式弹出窗口(您需要在返回地图之前将其关闭)。当然,这可以更改为具有非模式和自动关闭的弹出窗口


请进一步解释..我扩展了示例以说明我想做什么。谢谢。是否可以像点一样更改位置工具提示,在缩放时位置点会发生更改?有人试过了?非常感谢。此代码移动位置地图的点,但当地图有缩放时,工具提示不会移动到该点旁边。对不起,我解释错了。我想要的是,当我点击地图上的某个点时,像谷歌地图这样的窗口会显示信息。鼠标停留太长时间后,工具提示会随着鼠标停留而出现。好的,你是指弹出窗口,而不是工具提示:)你尝试过弹出窗口吗?您认为实现弹出窗口是否可行?非常感谢你的帮助!是的,很容易做到,我现在就发。如果你想要一个非常好的弹出控件,你需要使用ControlsFX,它也是开源的(但是你会给你的移动应用程序增加一个很大的依赖项)。