【问题标题】:Android cluster and marker clicksAndroid 集群和标记点击次数
【发布时间】:2015-12-29 18:36:24
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

    标签: android google-maps android-maps-utils


    【解决方案1】:

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

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

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

    【讨论】:

    • 完美运行,谢谢。阅读您提供的 MarkerManager 链接对我很有帮助,这是一个很好的建议。
    • @NasaGeek 添加带有MarkerManager 的标记后,集群无法正常工作!你能提供任何sn-p吗?
    【解决方案2】:

    接收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;
    }
    

    【讨论】:

    • 这个比较简单。
    • 但是如果你有一个从ClusterItem扩展的类,它就没有更多的属性了。例如IconId、...。
    • @Mr.Hyde 也许你可以欺骗系统,如果你有一个数据库,Lat 和 Lng 不会改变,你可以反转数据。我会在我的项目中实现它。谢谢@Atul!
    • @Mr.Hyde 传递给 onClusterItemClick 的项目仍应保留其原始类型,因此您可以将其转换为正确的对象以保留字段。即 MyObject mine = (MyObject) clusterItem;
    【解决方案3】:

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

    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;
        }
    
    
     }
    

    【讨论】:

      【解决方案4】:

      简单的解决方案

      刚刚遇到同样的问题。解决方案很简单:从您自己的事件侦听器中调用 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
          });
      }
      
      
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        相关资源
        最近更新 更多