有没有办法在Google地图v2上的标记上设置longClickListsner
?我想让用户长按标记并显示一个对话框,其中包含删除或查看信息的选项。可以这样做吗?
答案 0 :(得分:16)
我有另一个主张。
首先我将标记拖动:
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来模拟长按)
希望有所帮助
答案 1 :(得分:12)
Marker类没有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;
}
}
}
});
答案 2 :(得分:5)
正如ARP建议的那样,您可以使用OnMarkerDragListener来模拟长按。在我的情况下,我在onMapLongClick()发生时创建新标记,所以我想做类似(但不相等)的事情
@Override
public void onMarkerDragStart(Marker marker) {
marker.remove();
MarkerOptions options = createBasedOnMarker(marker);
this.googleMap.addMarker(options);
}
这样,你将删除以前在地图中的标记,并在同一位置创建另一个具有相同内容的标记(你必须有一个地图或一对来保存你创建的标记的信息)。 / p>
希望我的解决方法有所帮助。
答案 3 :(得分:3)
ARPs答案很好,但它有一个难看的效果:当你开始拖动时标记会向上移动,当你完成标记时,标记仍然比你用手指指向的位置更高。
答案 4 :(得分:2)
akaya's answer不是一种糟糕的方法,但是如果你有 com.google.maps.android:android-maps-utils:0.3 + library included你的项目你可以准确地了解距离:
double distance = SphericalUtil.computeDistanceBetween(
marker.getPosition(),
latLng
);
if( distance < 50 ) { // closer than 50 meters?
//..do stuff..
}
答案 5 :(得分:2)
嘿看看这段代码我刚停止拖动标记并使用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());
}
});
答案 6 :(得分:0)
万一有人可能需要它,我调整了一个对数函数来计算提到的接近阈值@akaya,这适用于5.0到18之间的缩放。这是函数:
float zoom = mMap.getCameraPosition().zoom;
double maxDistance = 2000000 * Math.exp(-0.644*zoom);
答案 7 :(得分:0)
这是一个简单的工作解决方案。我们需要使用屏幕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
}
}