Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android谷歌地图标记可缩放图标_Android_Google Maps_Icons_Marker - Fatal编程技术网

android谷歌地图标记可缩放图标

android谷歌地图标记可缩放图标,android,google-maps,icons,marker,Android,Google Maps,Icons,Marker,我正在使用GooglePlacesAPI填充用户周围的内容,目前一切正常。我使用API返回的图标来设置每个标记。 这是非常好的,除了一些图标很难看,但问题是,每当我在缩放级别13左右缩小时,它就会过度堆叠 每当我放大太多的时候,我都试图实现一些东西来隐藏标记,或者试图找到一个数学公式来更改标记的alpha属性,以便它们随着我的放大而平滑地隐藏自己,但这些解决方案不是很令人愉快 map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeLi

我正在使用GooglePlacesAPI填充用户周围的内容,目前一切正常。我使用API返回的图标来设置每个标记。 这是非常好的,除了一些图标很难看,但问题是,每当我在缩放级别13左右缩小时,它就会过度堆叠 每当我放大太多的时候,我都试图实现一些东西来隐藏标记,或者试图找到一个数学公式来更改标记的alpha属性,以便它们随着我的放大而平滑地隐藏自己,但这些解决方案不是很令人愉快

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;
        }
    }
});