我创建了一个应用程序,其中所有标记都有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监听器?提前谢谢。
答案 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);
}
你会和以前一样。
如果你想创建一个自定义信息窗口,它会变得有点复杂。