簡體   English   中英

Android Google為clusterItems映射markerClickListener

[英]Android Google maps markerClickListener for clusterItems

我正在嘗試為我的googlemaps標記實現群集。 目前我有一些自定義標記顏色與API調用,當您單擊它們時會觸發。 加載這些結果后,將打開一個底圖,其中包含該標記的特定信息。

我希望保持相同的功能(自定義標記/ clickListeners / radius圍繞標記),但在縮小時添加群集。 我已經查看了不同的幫助來源:

Android群集和標記點擊

Android標記聚類

MarkerManager.java

但我不確定如何為集群項實現自定義標記和偵聽器。 我能夠使用標准標記獲得沒有clicklisteners的集群。 以下是一些插圖圖片:

這是我目前的情況(我想聚集這些標記)。 如您所見,單擊標記時會彈出底部工作表

目前的情況

這是我目前能夠做的,但我想將它與前一張圖片結合起來

集群地圖

這是我的地圖片段代碼的重要部分,( 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();
    }

我希望有人可以幫助我朝着正確的方向前進。 謝謝!

好的,經過一些更多的追蹤和錯誤之后,我想我已經把它整理好了。 我所要做的就是將自定義DefaultClusterRenderer附加到我的clusterManager。 在mapfragment中,我可以使用onClusterItemClick來處理標記點擊。 我仍然遇到的一個問題是放大和縮小時圓圈都沒有正確渲染。

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

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