在地图标记上设置LongClickListener

时间:2013-03-13 16:57:39

标签: android google-maps google-maps-android-api-2

有没有办法在Google地图v2上的标记上设置longClickListsner?我想让用户长按标记并显示一个对话框,其中包含删除或查看信息的选项。可以这样做吗?

8 个答案:

答案 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答案很好,但它有一个难看的效果:当你开始拖动时标记会向上移动,当你完成标记时,标记仍然比你用手指指向的位置更高。

查看http://www.youtube.com/watch?v=RxAHHJD4nU8

答案 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
        }
    }