繁体   English   中英

如何在用户地图缩放上调整多个圆圈的大小?

[英]How to resize many Circles on user map zoom?

我使用以下代码在 Google Maps API 上绘制了许多圆圈:

Circle circle = map.addCircle(new CircleOptions()
                                    .center(lastKnownLatLng)
                                    .radius(4)
                                    .strokeColor(Color.RED)
                                    .fillColor(Color.RED));

并将它们存储到List<Circle> circleList = new ArrayList<>() ,方法是使用circleList.add(circle)将它们一一添加。 我想让这些圆的半径在用户“放大”和“缩小”时自动调整大小(就像折线类那样)。 这是我的解决方案,但我不知道如何计算新半径。

public GoogleMap.OnCameraChangeListener getCameraChangeListener() {
        return new GoogleMap.OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition position) {
                Log.d("Zoom", "Zoom: " + position.zoom);
                zoomLevel = position.zoom;
                if(!circleList.isEmpty()){
                    resizeCircles();
                }
            }
        };
    }

    public void resizeCircles() {
        if (???) { // if zoom in, it mean zoomLevel increase and I need to decrease radius
            double newRadius = ???

            for (int i = 0; i < circleList.size(); i++)
                circleList.get(i).setRadius(newRadius);
        }

        if (???) { // if zoom out, it mean zoomLevel decrease and I need to increase radius
            double newRadius = ???

            for (int i = 0; i < circleList.size(); i++)
                circleList.get(i).setRadius(newRadius);
        }
    }

原答案

找出未缩放时的默认半径。 然后使用缩放级别作为初始半径的乘数。

您可能还想将圆的初始半径更改为常数,以便可以在其他地方使用。 根据您的应用程序的需要调整此值。

private static final double INITIAL_RADIUS = 4.0;

不依赖于先前的缩放级别,而是找到当前的缩放级别,以便您可以确定适当的乘数。 当缩放级别增加 1 时,它会使视图的宽度加倍,因此我们希望圆半径具有类似的行为。

// Something like this, perhaps.
double newRadius = INITIAL_RADIUS * Math.pow(2.0, currentZoomLevel);

缩放级别 0 也是一种可能,因此这可能是一个特殊情况需要处理。

有关缩放级别的更多信息,请访问: https : //developers.google.com/maps/documentation/android-sdk/views#zoom

扩展答案

放大时减小圆圈大小正好相反。 可能需要调整初始半径。 同样,请注意 0 缩放级别的可能性。

// Something like this, perhaps.
double newRadius = INITIAL_RADIUS / Math.pow(2.0, currentZoomLevel);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM