【问题标题】:android GoogleMaps marker scalable iconandroid GoogleMaps 标记可缩放图标
【发布时间】:2014-08-18 15:40:11
【问题描述】:

我正在使用 GooglePlaces API 来填充用户周围的内容,目前一切正常。我使用 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 应用程序(但我并不真正了解它们在幕后实际执行的操作)。

【问题讨论】:

    标签: android google-maps icons marker


    【解决方案1】:

    似乎 Airbnb 只是在缩放级别更改时隐藏/显示特定标记。

    您可以使用Marker Clustering,以便标记在缩小时合并为一个组。如果这不是您想要的,请继续阅读。

    我回答了关于折线here 的类似问题。

    解决方案是创建一个稀疏数组,该数组针对特定缩放级别包含特定标记。例如:

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

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 2011-03-31
      • 2012-08-25
      • 2017-07-11
      • 1970-01-01
      • 2017-07-11
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多