【问题标题】:ClusterManager in GoogleMap androidGoogleMap android中的ClusterManager
【发布时间】:2015-08-12 12:19:12
【问题描述】:

我想在谷歌地图上实现标记聚类。它也应该涉及自定义渲染。所以我使用了https://github.com/googlemaps/android-maps-utils的示例代码,

参考演示中的 CustomMarkerClusteringDemoActivity.java。

我的问题是,当我点击集群时,它不会调用 onClusterClick()。类似地,在点击集群项目时,不会调用 onClusterItemClick()。

我不明白我哪里错了,请帮忙....

我正在使用:

第 1 步:

private ClusterManager<MarkerCluster> mClusterManager;

第 2 步:

private class MarkerRenderer extends DefaultClusterRenderer<MarkerCluster> {

    private final IconGenerator mIconGenerator = 
        new IconGenerator(context.getApplicationContext());
    private final IconGenerator mClusterIconGenerator = 
        new IconGenerator(context.getApplicationContext());
    private final ImageView mImageView = null;
    private final TextView mClusterTextCounter;
    private final ImageView mClusterImageView;
    private final int mDimension = 0;

    public MarkerRenderer() {
        super(context.getApplicationContext(), mMap, mClusterManager);

        View multiProfile = getActivity().getLayoutInflater()
            .inflate(R.layout.layout_marker_render, null);
        mClusterIconGenerator.setContentView(multiProfile);
        mClusterImageView = (ImageView)multiProfile
            .findViewById(R.id.lyt_marker_render_img_pin);
        mClusterTextCounter = (TextView) multiProfile
            .findViewById(R.id.lyt_marker_render_txt_counter);

    }

    @Override
    protected void onBeforeClusterItemRendered(MarkerCluster markercluster, MarkerOptions markerOptions) {
        // Draw a single person.
        // Set the info window to show their name.
        Item mItem = markercluster.getItem();

        if(mItem != null){

            if(mItem.get_UserType().equalsIgnoreCase("2")){
                markerOptions
                    .title(mItem.get_maker() + " - " + mItem.get_carModel())
                    .icon(icon_blue);
            }else{
                markerOptions
                    .title(mItem.get_maker() + " - " + mItem.get_carModel())
                    .icon(icon_gray);
            }

        }
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<MarkerCluster> cluster, MarkerOptions markerOptions) {
        // Draw multiple people.
        // Note: this method runs on the UI thread. Don't spend too much time in here (like in this example).
        mClusterTextCounter.setText(cluster.getItems().size() + "");

        Drawable myDrawable;
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
            myDrawable = context.getResources()
                .getDrawable(R.drawable.pin_blue, context.getTheme());
        } else {
            myDrawable = context.getResources()
                .getDrawable(R.drawable.pin_blue);
        }

        mClusterImageView.setImageDrawable(myDrawable);

        mClusterIconGenerator.setBackground(
            context.getResources().getDrawable(R.drawable.map_btn)
        );

        Bitmap icon = mClusterIconGenerator.makeIcon(
            String.valueOf(cluster.getSize())
        );

        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        // Always render clusters.
        return cluster.getSize() > 1;
    }
}

第 3 步:

mClusterManager = new ClusterManager<MarkerCluster>(context, mMap);
mClusterManager.setRenderer(new MarkerRenderer());

mMap.setOnMarkerClickListener(mClusterManager);
mMap.setOnInfoWindowClickListener(mClusterManager);
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {

        if (mClusterManager != null) {
            mClusterManager.onCameraChange(cameraPosition);
        }

        // Some Other Tasks here

    }
});

mClusterManager.setOnClusterClickListener(
    new ClusterManager.OnClusterClickListener<MarkerCluster>() {
        @Override
        public boolean onClusterClick(Cluster<MarkerCluster> cluster) {
            LatLngBounds.Builder builder = LatLngBounds.builder();
            for (MarkerCluster item : cluster.getItems()) {
                builder.include(item.getPosition());
            }
            final LatLngBounds bounds = builder.build();
            mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));

            return true;
    }
});


mClusterManager.setOnClusterItemClickListener(
    new ClusterManager.OnClusterItemClickListener<MarkerCluster>() {
        @Override
        public boolean onClusterItemClick(MarkerCluster markerCluster) {

            Item item = markerCluster.getItem();
            if (mItem != null) {

                MarkerClickDialog mMarkerClickDialog = new MarkerClickDialog(context, mItem);
                mMarkerClickDialog.show();
        }

        return false;
    }
});

for (int i = 0; i < mItemList.size(); i++) {

    Item mItem = mItemList.get(i);
    if (mMap != null) {
        displayLocation(
            Double.parseDouble(mItem.get_Latitude()),
            Double.parseDouble(mItem.get_Longitude()), 
            mItem
        );
    }
}

private void displayLocation(double latitude, double longitude, Item mItem){

    // create marker
    if(mMap != null){
        Marker mMarker = null;

        MarkerCluster offsetItem = new MarkerCluster(new LatLng(latitude, longitude), "Test", R.drawable.pin_blue, mItem);
        mClusterManager.addItem(offsetItem);
        mClusterManager.cluster();
    }
}

【问题讨论】:

    标签: android maps markerclusterer


    【解决方案1】:

    在您的MarkerRenderer 构造函数中,有super(context.getApplicationContext(), mMap, mClusterManager);

    您仍然需要您的 GoogleMap 对象和 ClusterManager。您应该将参数传递给构造函数!像这样写:

    public CustomRenderer(Context context, GoogleMap map, ClusterManager clusterManager) {
        super(context, map, clusterManager);
        ...
    

    而当你设置Renderer的时候,这样写

    mClusterManager.setRenderer(new MarkerRenderer(mContext, mMap, mClusterManager));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多