android谷歌地图标记可缩放图标
我正在使用GooglePlacesAPI填充用户周围的内容,目前一切正常。我使用API返回的图标来设置每个标记。 这是非常好的,除了一些图标很难看,但问题是,每当我在缩放级别13左右缩小时,它就会过度堆叠 每当我放大太多的时候,我都试图实现一些东西来隐藏标记,或者试图找到一个数学公式来更改标记的alpha属性,以便它们随着我的放大而平滑地隐藏自己,但这些解决方案不是很令人愉快android谷歌地图标记可缩放图标,android,google-maps,icons,marker,Android,Google Maps,Icons,Marker,我正在使用GooglePlacesAPI填充用户周围的内容,目前一切正常。我使用API返回的图标来设置每个标记。 这是非常好的,除了一些图标很难看,但问题是,每当我在缩放级别13左右缩小时,它就会过度堆叠 每当我放大太多的时候,我都试图实现一些东西来隐藏标记,或者试图找到一个数学公式来更改标记的alpha属性,以便它们随着我的放大而平滑地隐藏自己,但这些解决方案不是很令人愉快 map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeLi
map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
float zoomLevel = cameraPosition.zoom;
if (zoomLevel < 13) {
for (int i = 0; i < places.size(); i++)
places.get(i).setVisible(false);
} else {
for (int i = 0; i < places.size(); i++) {
places.get(i).setVisible(true);
}
}
}
});
有没有办法处理这种情况
我有一个例子:AirBnb应用程序,但我不太了解它们在场景背后的实际表现。当缩放级别改变时,AirBnb似乎只是隐藏/显示特定的标记 您可以使用这些标记,以便在缩小时将它们合并到一个组中。如果这不是你想要的,继续读下去 我回答了一个关于多段线的类似问题 解决方案是创建一个稀疏数组,对于特定的缩放级别,该数组包含特定的标记。例如:
// Zoom level 16 and up
List<Marker> markers = new ArrayList<Marker>();
markers.add(mMap.addMarker(new MarkerOptions()
.position(new LatLng(48.867068, 2.351503))));
...
// Markers are hidden by default
for (Marker marker : markers) marker.setVisible(false);
mZoomMarkers.put(16, markers);
然后初始化地图,显示一些标记:
SparseArray<List<Marker>> mZoomMarkers = new SparseArray<List<Marker>>();
int mZoomLevel = 16;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
// Zoom to 16
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(point, mZoomLevel), 1000, null);
// Reveal markers
for(int i=0; i<mZoomMarkers.size(); i++) {
// Loop until zoom level is reached
if (mZoomMarkers.keyAt(i) > zoomLevel) break;
showMarkers(mZoomMarkers.get(mZoomMarkers.keyAt(i)));
}
...
}
private void showMarkers(List<Marker> markers) {
if (markers != null) {
for (Marker marker : markers) marker.setVisible(true);
}
}
private void hideMarkers(List<Marker> markers) {
if (markers != null) {
for (Marker marker : markers) marker.setVisible(false);
}
}
最后,设置缩放级别侦听器以相应地添加/删除标记:
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
/* Note that because we are casting the zoomLevel to int,
* it will be considered as changed only when it reaches
* a new integer when rounded (e.g. 5.0, 6.0 etc.) */
int newZoomLevel = (int) cameraPosition.zoom;
if (newZoomLevel != mZoomLevel) {
Log.d(TAG, "New zoom level: " + newZoomLevel);
// Loop all the changed zoom levels
// E.g. zoomed-out from 15 to 13, then hide [14, 15]
if (newZoomLevel < mZoomLevel) { // Zoomed out
for (int i=1; i<=mZoomLevel-newZoomLevel; i++)
hideMarkers(mZoomMarkers.get(newZoomLevel + i));
} else { // Zoomed-in
for (int i=1; i<=newZoomLevel-mZoomLevel; i++)
showMarkers(mZoomMarkers.get(mZoomLevel + i));
}
mZoomLevel = newZoomLevel;
}
}
});