相关疑难解决方法(0)

在 Google Maps API v2 中在屏幕上绘制恒定大小的圆圈

我正在使用 Gooogle Maps API v2 开发 Android 应用程序。我的地图上有标记,我想圈出其中一个。通过使用 Circle 和 Circle Options 类,我设法轻松地做到了这一点。但我也希望我的圆圈在缩放或取消缩放时在屏幕上保持相同的大小,就像标记一样。这意味着圆必须具有以像素为单位的恒定半径。遗憾的是,我们无法在 API v2 中以像素为单位设置半径。

我尝试了几种解决方案,但我并不满意。

在第一个中,我只是乘以或除以半径:

@Override
public void onCameraChange(CameraPosition position) 
{
    if(previousZoom > position.zoom) {
        mSelectionCircle.setRadius(Math.abs(position.zoom - previousZoom)*2*mSelectionCircle.getRadius());
    }
    else if(previousZoom < position.zoom) {
        mSelectionCircle.setRadius(Math.abs(position.zoom - previousZoom)*mSelectionCircle.getRadius()/2);
    }

    previousZoom = position.zoom;
}
Run Code Online (Sandbox Code Playgroud)

起初它似乎有效,但在快速缩放或用手指缩放时会产生错误的结果。此外,缩放比例在屏幕上清晰可见。

我的第二个解决方案使用像素-米转换。这个想法是在缩放/取消缩放时以米为单位重新计算半径,因此圆圈在屏幕上具有恒定的大小。为此,我获取了 Circle 在屏幕上的当前位置:

 Point p1 = mMap.getProjection().toScreenLocation(mSelectionCircle.getCenter());
Run Code Online (Sandbox Code Playgroud)

然后我在圆的边缘创建另一个点:

 Point p2 = new Point(p1.x + radiusInPixels, p1.y);
Run Code Online (Sandbox Code Playgroud)

在哪里

 int radiusInPixels = 40;
Run Code Online (Sandbox Code Playgroud)

之后,我使用一个函数返回这两个点之间的距离(以米为单位)。

private double convertPixelsToMeters(Point point1, Point point2) {

    double angle = Math.acos(Math.sin(point1.x) * …
Run Code Online (Sandbox Code Playgroud)

android google-maps-android-api-2

6
推荐指数
2
解决办法
5034
查看次数

使用 GroundOverlay 的脉冲动画

我需要通过脉冲动画显示位置 A 和位置 B。我可以使用下面的代码来实现这一点。但我面临的问题是,当缩放级别发生变化时,GroundOverlay 也会改变其大小。如果位置A和B彼此靠近(即地图放大级别较高),则脉冲半径太大。当我缩小时,它变得太小了。

无论地图的缩放级别如何,如何保持叠加层的大小相同。

下面的代码是从这里引用的:Google Maps v2 上的动画透明圆没有正确动画化

private void showRipples(LatLng latLng, int color) {
    GradientDrawable d = new GradientDrawable();
    d.setShape(GradientDrawable.OVAL);
    d.setSize(500, 500);
    d.setColor(ContextCompat.getColor(Activity.this, color));
    d.setStroke(0, Color.TRANSPARENT);

    final Bitmap bitmap = Bitmap.createBitmap(d.getIntrinsicWidth()
            , d.getIntrinsicHeight()
            , Bitmap.Config.ARGB_8888);

    // Convert the drawable to bitmap
    final Canvas canvas = new Canvas(bitmap);
    d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    d.draw(canvas);

    // Radius of the circle
    final int radius = getResources().getDimensionPixelSize(R.dimen.ripple_radius);

    // Add the circle to the map
    final GroundOverlay circle = googleMap.addGroundOverlay(new GroundOverlayOptions()
            .position(latLng, …
Run Code Online (Sandbox Code Playgroud)

animation android google-maps gmsgroundoverlay

4
推荐指数
1
解决办法
1907
查看次数