简体   繁体   English

Android Google为clusterItems映射markerClickListener

[英]Android Google maps markerClickListener for clusterItems

I'm trying to implement clusters for my googlemaps markers. 我正在尝试为我的googlemaps标记实现群集。 Currently I have some custom marker colors with an API call that fires when you click on them. 目前我有一些自定义标记颜色与API调用,当您单击它们时会触发。 When those results are loaded, there will open a bottomsheet with the specific information of that marker. 加载这些结果后,将打开一个底图,其中包含该标记的特定信息。

I want to keep the same functionalities (custom markers/clickListeners/radius around markers), but add clusters when zoomed out. 我希望保持相同的功能(自定义标记/ clickListeners / radius围绕标记),但在缩小时添加群集。 I've looked at different sources for help: 我已经查看了不同的帮助来源:

Android cluster and marker clicks Android群集和标记点击

Android marker-clustering Android标记聚类

MarkerManager.java MarkerManager.java

But i'm not sure how to implement the custom marker and listener for the clusters items. 但我不确定如何为集群项实现自定义标记和侦听器。 I'am able to get clusters with standard markers without clicklisteners. 我能够使用标准标记获得没有clicklisteners的集群。 Here are some images for illustration: 以下是一些插图图片:

This is my current situation (I want to cluster these markers). 这是我目前的情况(我想聚集这些标记)。 As you can see, the bottom sheet pops up when I click on a marker 如您所见,单击标记时会弹出底部工作表

目前的情况

This is what I'm currently able to do, but I want to combine it with the previous picture 这是我目前能够做的,但我想将它与前一张图片结合起来

集群地图

Here is the important part of my code of my map Fragment, (The Point class does implement the ClusterItem interface): 这是我的地图片段代码的重要部分,( Point类实现了ClusterItem接口):

private Map<Marker, Point> retailerInfo = new HashMap<>();

    private void markGeofencesOnMap() {
        new GeofenceAreasRequest().getAllAreas(new GeofenceAreasCallback() {
            @Override
            public void onAreasLoaded(List<Point> points) {
                for (final Point point : points) {
                    markerForGeofence(point);
                    drawRadius(point);
                }
            }
            @Override
            public void failedOnAreasLoaded(int message) {
                Snackbar.make(coordinatorLayout, R.string.failed_loading_areas, Snackbar.LENGTH_LONG).show();
            }
        });
    }

    private void markerForGeofence(Point point) {
        LatLng latLng = new LatLng(point.getLatitude(), point.getLongitude());
        MarkerOptions markerOptions = new MarkerOptions()
                .position(latLng)
                .flat(true)
                .title(point.getTitle())
                .icon(BitmapDescriptorFactory.defaultMarker(195));
//        markerManager.getCollection("markerCollection").addMarker(markerOptions);
//        markerManager.getCollection("markerCollection").setOnMarkerClickListener(this);
//        mClusterManager.addItem(point);
        geoFenceMarker = googleMap.addMarker(markerOptions);
        retailerInfo.put(geoFenceMarker, point);
    }

    private void drawRadius(Point point) {
        CircleOptions circleOptions = new CircleOptions()
                .center(geoFenceMarker.getPosition())
                .strokeColor(Color.argb(50, 70, 70, 70))
                .fillColor(Color.argb(100, 150, 150, 150))
                .radius(point.getRadius());
        googleMap.addCircle(circleOptions);
    }

    private void googleMapSettings() {
        int permissionCheck = ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            googleMap.setMyLocationEnabled(true);
        } else {
            SystemRequirementsChecker.checkWithDefaultDialogs(getActivity());
        }
        googleMap.getUiSettings().setZoomControlsEnabled(true);
        CameraPosition cameraPosition = new CameraPosition.Builder().target(getLastLocation()).zoom(12).build();
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
        googleMap.setOnMapClickListener(this);
//        markerManager = new MarkerManager(googleMap);
//        markerManager.newCollection("markerCollection");
//        mClusterManager = new ClusterManager<Point>(getActivity(), googleMap );//, markerManager);
//        googleMap.setOnMarkerClickListener(mClusterManager); //markerManager);
        googleMap.setOnCameraIdleListener(mClusterManager);
        googleMap.setOnMarkerClickListener(this);
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        if (retailerInfo != null) {
            String retailerId = retailerInfo.get(marker).getRetailer();
            new RetailersRequest().getRetailer(retailerId, new RetailersCallback() {
                @Override
                public void onRetailersLoad(List<Retailer> retailers) {
                    for (final Retailer retailer : retailers) {
                        mMapRetailerName.setText(retailer.getName());
                        mMapRetailerStreet.setText(retailer.getStreet());
                        mMapRetailerHouseNr.setText(retailer.getHousenumber());
                        mMapRetailerPostalCode.setText(retailer.getPostalCode());
                        mMapRetailerCity.setText(retailer.getCity());
                    }
                    bottomSheet.setVisibility(View.VISIBLE);
                    mBottomSheetBehavior.setPeekHeight(400);
                    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                }

                @Override
                public void failedOnRetailersLoaded(int code) {
                    Snackbar.make(coordinatorLayout, getString(R.string.failed_loading_retailers) + code, Snackbar.LENGTH_LONG).show();
                }
            });
            CameraPosition cameraPosition = new CameraPosition.Builder().target(marker.getPosition()).zoom(14).build();
            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
        }
        return true;
    }

    @Override
    public void onMapClick(LatLng latLng) {
        bottomSheet.setVisibility(View.GONE);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        this.googleMap = googleMap;
        googleMapSettings();
        markGeofencesOnMap();
    }

I hope someone can help me out in the right direction. 我希望有人可以帮助我朝着正确的方向前进。 Thx! 谢谢!

Okay, after some more trail and error, I think I've got it sorted out for the most part. 好的,经过一些更多的追踪和错误之后,我想我已经把它整理好了。 All I had to do was to attach a custom DefaultClusterRenderer to my clusterManager. 我所要做的就是将自定义DefaultClusterRenderer附加到我的clusterManager。 In the mapfragment I could use onClusterItemClick for handling the marker clicks. 在mapfragment中,我可以使用onClusterItemClick来处理标记点击。 The one problem I still have is that the circles are not all properly rendered when zooming in and out. 我仍然遇到的一个问题是放大和缩小时圆圈都没有正确渲染。

private void markGeofencesOnMap() {
    new GeofenceAreasRequest().getAllAreas(new GeofenceAreasCallback() {
        @Override
        public void onAreasLoaded(List<Point> points) {
            for (final Point point : points) {
                mClusterManager.addItem(point);
            }
        }
    });
}

private void googleMapSettings() {        
    mClusterManager = new ClusterManager<Point>(getActivity(), googleMap );
    // attach custom renderer behaviour
    mClusterManager.setRenderer(new OwnPointRendered(getActivity().getApplicationContext(), googleMap, mClusterManager)); 
    mClusterManager.setOnClusterItemClickListener(this);
    googleMap.setOnMarkerClickListener(mClusterManager);
    googleMap.setOnCameraIdleListener(mClusterManager);
}

@Override
public boolean onClusterItemClick(ClusterItem clusterItem) {
    // cast ClusterItem to my Point class to handle marker clicks
    Point retailer = (Point) clusterItem;
    String retailerId = retailer.getRetailer();
    return true;
}

OwnPointRendered.class OwnPointRendered.class

public class OwnPointRendered extends DefaultClusterRenderer<Point> {
private final GoogleMap map;
private List<Circle> circleList = new ArrayList<>();

public OwnPointRendered(Context context, GoogleMap map,
                        ClusterManager<Point> clusterManager) {
    super(context, map, clusterManager);
    this.map = map;
}

@Override
protected void onBeforeClusterItemRendered(Point item, MarkerOptions markerOptions) {
    markerOptions.flat(true);
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(195));
    drawRadius(item);
    super.onBeforeClusterItemRendered(item, markerOptions);
}

@Override
protected void onClusterRendered(Cluster<Point> cluster, Marker marker) {
    super.onClusterRendered(cluster, marker);
    for (Circle circle : circleList) {
        circle.remove();
    }
    circleList.clear();
}

private void drawRadius(Point point) {
    CircleOptions circleOptions = new CircleOptions()
            .center(point.getPosition())
            .strokeColor(Color.argb(50, 70, 70, 70))
            .fillColor(Color.argb(100, 150, 150, 150))
            .radius(point.getRadius());
    Circle circle = map.addCircle(circleOptions);
    circleList.add(circle);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM