如何在google maps v2中使用android map utils库实现InfoWindow?

时间:2015-04-30 15:21:15

标签: android google-maps google-maps-android-api-2

我创建了一个应用程序,其中所有标记都有CustomInfoWindow.But我的应用程序中的标记数量越来越大。所以我看到了map-utils库并决定实现它。我想实现标记聚类属性。在实现标记聚类属性之前,我在我的应用程序中有这个代码:

private void drawMarkerAndLine(ArrayList<StatusData> result) throws Exception{
        try {
            if (result.size() != 0) {
                PolygonOptions options = new PolygonOptions()
                        .fillColor(0x330000FF)
                        .strokeColor(Color.BLUE)
                        .strokeWidth(3);
                for (int i = 0; i < result.size(); i++) {
                    String status = result.get(i).getStatus();
                    String name = result.get(i).getPersonName();
                    String email = result.get(i).getPersonMail();
                    name += "/" + email;
                    Double lat = Double.parseDouble(result.get(i).getLatitude());
                    Double lng = Double.parseDouble(result.get(i).getLongitude());
                    if (status.length() > 20) {
                        status = status.substring(0, 20);
                        status += "...";
                    }
                    LatLng ll = new LatLng(lat, lng);
                    options.add(ll);
                    map.addMarker(new MarkerOptions().position(ll).title(name).snippet(status));
                    if (i == 0) {
                        map.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 15));
                    }
                }
                map.addPolygon(options);
            }
        }catch ( Exception e){
            Toast.makeText(getActivity(),"Internet Connection Error.",Toast.LENGTH_SHORT).show();
        }

现在我想要保留我以前的所有属性,如infowindow click,map.setInfoWindowAdapter和其他。我想要实现,当我缩小标记将聚集,当放大它将显示标记,我可以点击像我之前的infowindow。我试图改变我的这个课但是徒劳。

private void drawMarkerAndLine(ArrayList<StatusData> result) throws Exception{
        try {
            if (result.size() != 0) {
                /*PolygonOptions options = new PolygonOptions()
                        .fillColor(0x330000FF)
                        .strokeColor(Color.BLUE)
                        .strokeWidth(3);*/
                for (int i = 0; i < result.size(); i++) {
                    String status = result.get(i).getStatus();
                    String name = result.get(i).getPersonName();
                    String email = result.get(i).getPersonMail();
                    name += "/" + email;
                    Double lat = Double.parseDouble(result.get(i).getLatitude());
                    Double lng = Double.parseDouble(result.get(i).getLongitude());
                    if (status.length() > 20) {
                        status = status.substring(0, 20);
                        status += "...";
                    }
                    LatLng ll = new LatLng(lat, lng);
                    //options.add(ll);
                    MyItem item = new MyItem(lat,lng);
                    clusterManager.addItem(item);
                    map.addMarker(new MarkerOptions().position(ll).title(name).snippet(status));
                    if (i == 0) {
                        map.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 15));
                    }
                }
                //map.addPolygon(options);

            }
        }catch ( Exception e){
            Toast.makeText(getActivity(),"Internet Connection Error.",Toast.LENGTH_SHORT).show();
        }

我在其他活动中尝试了这个,它适用于下面的代码。但是当我不能在我之前的代码中实现聚类属性时。

 public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {


        View v = inflater.inflate(R.layout.home_map_activity, null, false);

        mapFrag = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map);
        map = mapFrag.getMap();
        map.setMyLocationEnabled(true);
        map.getUiSettings().setZoomControlsEnabled(true);
        map.getUiSettings().setCompassEnabled(true);
        map.getUiSettings().setMyLocationButtonEnabled(true);
        map.getUiSettings().setAllGesturesEnabled(true);
        map.setTrafficEnabled(true);
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446),10));
        mClusterManager = new ClusterManager<MyItem>(getActivity(), map);
        map.setOnCameraChangeListener(mClusterManager);

        drawMarker();

        return v;
    }

    private void drawMarker() {
        double lat = 51.5145160;
        double lng = -0.1270060;

        // Add ten cluster items in close proximity, for purposes of this example.
        for (int i = 0; i < 10; i++) {
            double offset = i / 60d;
            lat = lat + offset;
            lng = lng + offset;
            MyItem offsetItem = new MyItem(lat, lng);
            mClusterManager.addItem(offsetItem);
        }
    } 

如何在我之前的代码中使用infowindow click和其他更改来实现这一点,因为我不需要在clustermanager中使用任何onclick监听器?提前谢谢。

1 个答案:

答案 0 :(得分:1)

有些事情是错误的。

1-您不必像以前那样创建标记,只需添加&#39; MyItem&#39;到集群管理器就足够了。

2-标记的标题,摘要,位置和您想要显示的任何数据都应该在您的“我的项目”中。类。

所以你的&#39; MyItem&#39; class应该看起来像这样:

public class MyItem implements ClusterItem{
private final LatLng position;
private final String status;
private final String name;
private final String email;

public MyItem(LatLng position2, String status2, String name2, String email2) {

    position = position2;
    status = status2;
    name = name2;
    email = email2;

}

@Override
public LatLng getPosition() {
    return position;
}
public String getStatus() {
    return status;
}
public String getName() {
    return name;
}
public String getEmail() {
    return email;
}
}

然后在你的活动中创建像

这样的项目
clusterManager.addItem(new MyItem(......));

最后在你扩展DefaultClusterRenderer&lt;的类中MyItem&gt;

 @Override
    protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) {
        super.onBeforeClusterItemRendered(item, markerOptions);

markerOptions.position(item.getPosition()).title(item.getName()).snippet(item.getStatus);

}

你会和以前一样。

如果你想创建一个自定义信息窗口,它会变得有点复杂。