12

我在地图上使用 android 集群实用程序,并成功地使用 mClusterManager.setOnClusterItemClickListener() 为集群库处理的所有标记实现了 onclick 侦听器。

因为我还希望一些标记始终不聚集,所以我还添加了一些标记,而不使用 mClusterManager,而是直接使用地图的 mMap.addMarker(),这样我可以确定它们永远不会聚集在地图上。

我的问题是我无法拦截对这些标记(总是未聚集的标记)的点击,因为我已经使用 mMap.setOnMarkerClickListener(mClusterManager) 来处理点击的集群的标记。

有没有办法收听单击的群集标记和群集库未处理的单击标记?

或者有没有办法指定集群管理器从不聚集一些标记?在这种情况下,我不必处理那些不同的点击侦听器,因为所有标记都将使用集群实用程序显示。

谢谢

4

4 回答 4

19

您可以创建一个MarkerManager传递给ClusterManager构造函数的 new。然后使用该方法创建一个新的标记集合MarkerManager#newCollection,并将您的普通标记添加到地图中MarkerManager.Collection#addMarker

然后,而不是调用mMap.setOnMarkerClickListener(mClusterManager),调用mMap.setOnMarkerClickListener(mMarkerManager),它将处理将您的Marker点击事件转发给适当的侦听器。您还需要使用该MarkerManager.Collection#setOnMarkerClickListener(GoogleMap.OnMarkerClickListener markerClickListener)函数为普通标记设置 onMarkerClick 侦听器。

我建议查看MarkerManagerClusterManager类的源代码,以更好地了解这些类如何交互。

于 2015-10-01T16:18:57.547 回答
8

接收点击事件的另一种方法Marker是使用OnClusterItemClickListener接口。

调用mClusterManager.setOnClusterItemClickListener(this);并让你的类实现OnClusterItemClickListener

然后在该onClusterItemClick方法中,您将获得 ClusterItem 这是被点击的标记,

@Override
public boolean onClusterItemClick(ClusterItem clusterItem) {

    Toast.makeText(getActivity(), "Latitude " + clusterItem.getPosition().latitude, Toast.LENGTH_LONG).show();

    return true;
}
于 2016-05-02T11:37:12.947 回答
0

在这里你可以看到我的代码。该示例已包含您需要的所有内容。

public class HomeFragment extends Fragment implements OnMapReadyCallback, ClusterManager.OnClusterClickListener<MarkerClusterItem> {

    ...

    @Override
    public void onMapReady(GoogleMap googleMap) {
        // Add a marker in Sydney, Australia,
        this.googleMap = googleMap;
        this.googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);


        setUpClusterManager();

        ...
    }

    private void setUpClusterManager(){
        // cluster
        clusterManager = new ClusterManager<MarkerClusterItem>(getActivity(), this.googleMap);
        clusterManager.setAnimation(false);
        MarkerClusterRenderer clusterRenderer = new MarkerClusterRenderer(getActivity(), googleMap, clusterManager);
        clusterManager.setRenderer(clusterRenderer);
        // marker clic
        clusterManager.setOnClusterClickListener(this);
    }

    @Override
    public boolean onClusterClick(Cluster<MarkerClusterItem> cluster) {
    if (cluster == null) return false;
        // do your stuff here 
        return true;
    }


 }
于 2019-11-15T10:44:59.467 回答
0

简单的解决方案

刚遇到同样的问题。解决方案很简单:从您自己的事件侦听器中调用 ClusterManager 侦听器。看概念:

private OnMapReadyCallback listenerMapReady = (googleMap) ->
{
    googleMap.setOnCameraIdleListener(() -> {
        mClusterManager.onCameraIdle(); //call cluster manager listener
        //....your code for setOnCameraIdleListener event
    });

    googleMap.setOnMarkerClickListener(marker -> {
        if (marker != null && ... check if marker is NOT from cluster manager ....) {
            //......your code for unclustered markers, added directly to the map
            return false;
        }
        else
            return mClusterManager != null && mClusterManager.onMarkerClick(marker); // let cluster manager do his job
    });
}

为了确保集群管理器内部不会拦截 onMarkerClick 侦听器,让每次集群管理器完成他的工作后重置侦听器。我已将其放入 OnCameraIdle 事件中:

public class FragmentRoutes extends Fragment {

private MapView mMapView;
private GoogleMap mMap;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_routes, container, false);

    mMapView = rootView.findViewById(R.id.ac_main_map); // map rendering holder
    if (mMapView != null)
        mMapView.onCreate(savedInstanceState);
    //....... other onCreate mess
}


@Override
public void onResume() {
    super.onResume();
    if (mMapView != null) {
        mMapView.onResume();
        mMapView.getMapAsync(listenerMapReady);
    }
}


// on marker click listener for the map
private GoogleMap.OnMarkerClickListener listenerMarkerClick = marker -> {
    //markers which tag is TransportItem were added directly to map, I will take care of them
    if (marker != null && marker.getTag() instanceof TransportItem) {
        //......do my tasks for clicked transport marker
        return false;
    }
    else {
       // other markers are cluster manager markers, process as usual
       return mClusterManager != null && mClusterManager.onMarkerClick(marker);
    }
}

// listener for map ready event
private OnMapReadyCallback listenerMapReady = (googleMap) ->
{
    if (getContext() == null)
        return;

    mMap = googleMap;

    mMap.setOnCameraIdleListener(() -> {
        mClusterManager.onCameraIdle();

        //....your code for setOnCameraIdleListener event

        // now reset marker click listener
        mMap.setOnMarkerClickListener(listenerMarkerClick); //reset marker click listener
    });
}


}

就这样!快乐的机器人 :)

于 2020-04-07T16:18:58.817 回答