googleMap onMarkerDrag 不更新标记的 .getPosition() Android Java
googleMap onMarkerDrag not updating marker's .getPosition() Android Java
我在 GoogleMap
上的三个 markers
之间绘制 polyLines
,其中两个是可移动的。我已将 onMarkerDragListener
应用到我的 fragment
。仅移动一个标记 'seems' 即可正常工作,直到我也移动第二个标记。如果我移动第二个标记,折线从第二个标记绘制,我正在移动到第一个标记的原始位置,而不是更新后的位置,这告诉我 xMarker.getPosition()
在标记为感动。如何确保 xMarker 的位置在拖动过程中得到更新?
我尝试将其设置为片段 class 级别的实现,并且在创建地图后也尝试过,如下所示:
googleMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
@Override
public void onMarkerDragStart(Marker marker) {
}
@Override
public void onMarkerDrag(Marker marker) {
}
@Override
public void onMarkerDragEnd(Marker marker) {
}
});
这是我的代码(目前使用 implements GoogleMap.OnMarkerListener
):
centerMarker = new MarkerOptions().position(
new LatLng(holeX, holeY)).title("CenterPoint");
backTeeMarker = new MarkerOptions().position(new LatLng(backTeeX,backTeeY)).title("BackTee");
flagMarker = new MarkerOptions().position(new LatLng(greenCenterX,greenCenterY)).title("flag");
centerMarker.draggable(true);
backTeeMarker.draggable(true);
flagMarker.draggable(false);
// adding marker
googleMap.addMarker(centerMarker);
googleMap.addMarker(backTeeMarker);
googleMap.addMarker(flagMarker);
backTeeToCenterPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(backTeeX, backTeeY),
new LatLng(centerMarker.getPosition().latitude, centerMarker.getPosition().longitude)
));
centerToFlagPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(centerMarker.getPosition().latitude,centerMarker.getPosition().longitude),
new LatLng(greenCenterX,greenCenterY)));
@Override
public void onMarkerDragStart(Marker marker) {
markerMoved(marker);
}
@Override
public void onMarkerDrag(Marker marker) {
markerMoved(marker);
}
@Override
public void onMarkerDragEnd(Marker marker) {
markerMoved(marker);
}
public void markerMoved(Marker marker) {
if (marker.getTitle().equals("CenterPoint")) {
backTeeToCenterPL.remove();
backTeeToCenterPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(backTeeMarker.getPosition().latitude, backTeeMarker.getPosition().longitude),
new LatLng(marker.getPosition().latitude, marker.getPosition().longitude)
));
backTeeToCenterPL.setColor(Color.WHITE);
centerToFlagPL.remove();
centerToFlagPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(marker.getPosition().latitude, marker.getPosition().longitude),
new LatLng(greenCenterX, greenCenterY)));
centerToFlagPL.setColor(Color.WHITE);
}
}
if (marker.getTitle().equals("BackTee")) {
backTeeToCenterPL.remove();
backTeeToCenterPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(marker.getPosition().latitude, marker.getPosition().longitude),
new LatLng(centerMarker.getPosition().latitude, centerMarker.getPosition().longitude)
));
backTeeToCenterPL.setColor(Color.WHITE);
centerToFlagPL.remove();
centerToFlagPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(centerMarker.getPosition().latitude, centerMarker.getPosition().longitude),
new LatLng(greenCenterX, greenCenterY)));
centerToFlagPL.setColor(Color.WHITE);
}
当移动标记时,我预计 centerMarker.position 和 backTeeMarker.position 会被 googleMap 自动更新,因为它是在一个新的地方绘制它,它必须了解它是新的地点。然而,事实并非如此。
它似乎更新了 onMarkerDragListener
中移动的 'marker' 位置,但从未将其转换为命名标记对象的位置。因此,要使用 markerMoved()
方法手动更新它,当我移动给定标记(例如 centerMarker)时,我必须添加以下行:
centerMarker.position(marker.getPosition())
.
我在 GoogleMap
上的三个 markers
之间绘制 polyLines
,其中两个是可移动的。我已将 onMarkerDragListener
应用到我的 fragment
。仅移动一个标记 'seems' 即可正常工作,直到我也移动第二个标记。如果我移动第二个标记,折线从第二个标记绘制,我正在移动到第一个标记的原始位置,而不是更新后的位置,这告诉我 xMarker.getPosition()
在标记为感动。如何确保 xMarker 的位置在拖动过程中得到更新?
我尝试将其设置为片段 class 级别的实现,并且在创建地图后也尝试过,如下所示:
googleMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
@Override
public void onMarkerDragStart(Marker marker) {
}
@Override
public void onMarkerDrag(Marker marker) {
}
@Override
public void onMarkerDragEnd(Marker marker) {
}
});
这是我的代码(目前使用 implements GoogleMap.OnMarkerListener
):
centerMarker = new MarkerOptions().position(
new LatLng(holeX, holeY)).title("CenterPoint");
backTeeMarker = new MarkerOptions().position(new LatLng(backTeeX,backTeeY)).title("BackTee");
flagMarker = new MarkerOptions().position(new LatLng(greenCenterX,greenCenterY)).title("flag");
centerMarker.draggable(true);
backTeeMarker.draggable(true);
flagMarker.draggable(false);
// adding marker
googleMap.addMarker(centerMarker);
googleMap.addMarker(backTeeMarker);
googleMap.addMarker(flagMarker);
backTeeToCenterPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(backTeeX, backTeeY),
new LatLng(centerMarker.getPosition().latitude, centerMarker.getPosition().longitude)
));
centerToFlagPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(centerMarker.getPosition().latitude,centerMarker.getPosition().longitude),
new LatLng(greenCenterX,greenCenterY)));
@Override
public void onMarkerDragStart(Marker marker) {
markerMoved(marker);
}
@Override
public void onMarkerDrag(Marker marker) {
markerMoved(marker);
}
@Override
public void onMarkerDragEnd(Marker marker) {
markerMoved(marker);
}
public void markerMoved(Marker marker) {
if (marker.getTitle().equals("CenterPoint")) {
backTeeToCenterPL.remove();
backTeeToCenterPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(backTeeMarker.getPosition().latitude, backTeeMarker.getPosition().longitude),
new LatLng(marker.getPosition().latitude, marker.getPosition().longitude)
));
backTeeToCenterPL.setColor(Color.WHITE);
centerToFlagPL.remove();
centerToFlagPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(marker.getPosition().latitude, marker.getPosition().longitude),
new LatLng(greenCenterX, greenCenterY)));
centerToFlagPL.setColor(Color.WHITE);
}
}
if (marker.getTitle().equals("BackTee")) {
backTeeToCenterPL.remove();
backTeeToCenterPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(marker.getPosition().latitude, marker.getPosition().longitude),
new LatLng(centerMarker.getPosition().latitude, centerMarker.getPosition().longitude)
));
backTeeToCenterPL.setColor(Color.WHITE);
centerToFlagPL.remove();
centerToFlagPL = googleMap.addPolyline((new PolylineOptions())
.clickable(false)
.add(new LatLng(centerMarker.getPosition().latitude, centerMarker.getPosition().longitude),
new LatLng(greenCenterX, greenCenterY)));
centerToFlagPL.setColor(Color.WHITE);
}
当移动标记时,我预计 centerMarker.position 和 backTeeMarker.position 会被 googleMap 自动更新,因为它是在一个新的地方绘制它,它必须了解它是新的地点。然而,事实并非如此。
它似乎更新了 onMarkerDragListener
中移动的 'marker' 位置,但从未将其转换为命名标记对象的位置。因此,要使用 markerMoved()
方法手动更新它,当我移动给定标记(例如 centerMarker)时,我必须添加以下行:
centerMarker.position(marker.getPosition())
.