16

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

4

8 回答 8

17

我还有一个提议。

首先,我使标记可拖动:

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 来模拟长按)

希望能帮助到你

于 2013-03-15T02:53:52.667 回答
14

标记类没有 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;
                    }
                }

            }
        });
于 2013-03-13T17:43:07.573 回答
7

正如 ARP 建议的那样,您可以使用 OnMarkerDragListener 来模拟长按。就我而言,当 onMapLongClick() 发生时,我正在创建新标记,所以我想做一些类似(但不等于)的事情

@Override
public void onMarkerDragStart(Marker marker) {
    marker.remove();
    MarkerOptions options = createBasedOnMarker(marker);
    this.googleMap.addMarker(options);
}

这样,您将删除以前在地图中的标记,并在相同位置创建另一个具有相同内容的标记(您必须有一个 Map 或 Pair 以保留您创建的标记中的信息)。

希望我的解决方法有所帮助。

于 2014-01-29T22:11:22.543 回答
3

ARP 的答案很好,但它有一个丑陋的效果:当您开始拖动时,标记会向上移动,当您完成时,标记仍处于比您用手指指向的位置更高的位置。

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

于 2013-12-07T15:38:40.127 回答
3

akaya 的回答不是一个坏方法,但如果您的项目中包含com.google.maps.android:android-maps-utils:0.3+ ,您可以准确了解距离:

double distance = SphericalUtil.computeDistanceBetween( 
    marker.getPosition(), 
    latLng 
);
if( distance < 50 ) { // closer than 50 meters?
    //..do stuff..
}
于 2015-07-10T08:44:16.840 回答
3

嘿,看看这段代码,我刚刚阻止了标记被拖动并使用了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());
            }
        });
于 2017-03-19T10:37:39.660 回答
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
        }
    }
于 2020-03-24T16:39:30.993 回答
0

以防万一有人需要它,我调整了一个对数函数来计算@akaya 提到的接近度阈值,它适用于 5.0 到 18 之间的缩放。这是函数:

float zoom = mMap.getCameraPosition().zoom;
double maxDistance = 2000000 * Math.exp(-0.644*zoom);
于 2017-03-01T12:20:56.687 回答