有没有办法longClickListsner
在谷歌地图 v2 上的标记上设置一个?我想让用户长按标记并显示一个对话框,其中包含删除或查看信息的选项。这可以做到吗?
8 回答
我还有一个提议。
首先,我使标记可拖动:
mapa.addMarker(new MarkerOptions() ...
.setDraggable(true);
在您可以像这样设置监听器 setOnMarkerDragListener 之后:
mapa.setOnMarkerDragListener(new OnMarkerDragListener() {
@Override
public void onMarkerDragStart(Marker marker) {
// TODO Auto-generated method stub
//Here your code
}
@Override
public void onMarkerDragEnd(Marker marker) {
// TODO Auto-generated method stub
}
@Override
public void onMarkerDrag(Marker marker) {
// TODO Auto-generated method stub
}
});
然后你可以覆盖你想要的(通常是 onMarkerDragStart 来模拟长按)
希望能帮助到你
标记类没有 LongClickListener。尽管这种方法远非完美,但这里有一个关于您可以做什么的想法。
为您的 GoogleMap 对象设置长点击侦听器。长按时,检查单击的位置是否足够靠近您的任何标记。要确定此接近度阈值,您可以使用地图缩放级别。
这是不太好的示例代码。我还没有尝试过,但它可能适合您的需求。
map.setOnMapLongClickListener(new OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
for(Marker marker : yourMarkerList) {
if(Math.abs(marker.getPosition().latitude - latLng.latitude) < 0.05 && Math.abs(marker.getPosition().longitude - latLng.longitude) < 0.05) {
Toast.makeText(MapActivity.this, "got clicked", Toast.LENGTH_SHORT).show(); //do some stuff
break;
}
}
}
});
正如 ARP 建议的那样,您可以使用 OnMarkerDragListener 来模拟长按。就我而言,当 onMapLongClick() 发生时,我正在创建新标记,所以我想做一些类似(但不等于)的事情
@Override
public void onMarkerDragStart(Marker marker) {
marker.remove();
MarkerOptions options = createBasedOnMarker(marker);
this.googleMap.addMarker(options);
}
这样,您将删除以前在地图中的标记,并在相同位置创建另一个具有相同内容的标记(您必须有一个 Map 或 Pair 以保留您创建的标记中的信息)。
希望我的解决方法有所帮助。
ARP 的答案很好,但它有一个丑陋的效果:当您开始拖动时,标记会向上移动,当您完成时,标记仍处于比您用手指指向的位置更高的位置。
嘿,看看这段代码,我刚刚阻止了标记被拖动并使用了onMarkerDragStart
的长按检测。
public abstract class LinkMarkerLongClickListener implements GoogleMap.OnMarkerDragListener {
private int previousIndex = -1;
private Marker cachedMarker = null;
private LatLng cachedDefaultPostion = null;
private List<Marker> markerList;
private List<LatLng> defaultPostions;
public LinkMarkerLongClickListener(List<Marker> markerList){
this.markerList = new ArrayList<>(markerList);
defaultPostions = new ArrayList<>(markerList.size());
for (Marker marker : markerList) {
defaultPostions.add(marker.getPosition());
marker.setDraggable(true);
}
}
public abstract void onLongClickListener(Marker marker);
@Override
public void onMarkerDragStart(Marker marker) {
onLongClickListener(marker);
setDefaultPostion(markerList.indexOf(marker));
}
@Override
public void onMarkerDrag(Marker marker) {
setDefaultPostion(markerList.indexOf(marker));
}
@Override
public void onMarkerDragEnd(Marker marker) {
setDefaultPostion(markerList.indexOf(marker));
}
private void setDefaultPostion(int markerIndex) {
if(previousIndex == -1 || previousIndex != markerIndex){
cachedMarker = markerList.get(markerIndex);
cachedDefaultPostion = defaultPostions.get(markerIndex);
previousIndex = markerIndex;
}
cachedMarker.setPosition(cachedDefaultPostion);
}
}
你可以这样称呼听众!
map.setOnMarkerDragListener(new LinkMarkerLongClickListener(markers) {
@Override
public void onLongClickListener(Marker marker) {
ToastUtils.showToast(Mission1Activity.this, marker.getTitle());
}
});
这是一个简单的工作解决方案。我们需要使用屏幕 xy 来检查距离。
googleMap.setOnMapLongClickListener{ loc ->
var distance = 10000
var nearestMarker: Marker? = null
allBcmMarkers.forEach { mrkr ->
googleMap?.projection?.let { prj ->
val tapXY = prj.toScreenLocation(loc)
val mrkrXY = prj.toScreenLocation(mrkr.position)
val THRESH = 50
val xDiff = abs(tapXY.x - mrkrXY.x)
val yDiff = abs(tapXY.y - mrkrXY.y)
if (xDiff < THRESH && yDiff < THRESH) {
val mrkrDist =
sqrt((xDiff * xDiff + yDiff * yDiff + xDiff * yDiff).toDouble())
if (mrkrDist < distance) {
distance = mrkrDist.toInt()
nearestMarker = mrkr
}
}
}
}
// you have nearestMarker
}
}
以防万一有人需要它,我调整了一个对数函数来计算@akaya 提到的接近度阈值,它适用于 5.0 到 18 之间的缩放。这是函数:
float zoom = mMap.getCameraPosition().zoom;
double maxDistance = 2000000 * Math.exp(-0.644*zoom);