如何使用 Google Maps SDK 中的自定义 LocationSource 平滑地为当前位置设置动画?

Posted

技术标签:

【中文标题】如何使用 Google Maps SDK 中的自定义 LocationSource 平滑地为当前位置设置动画?【英文标题】:How to smoothly animate current position with a custom LocationSource in Google Maps SDK? 【发布时间】:2021-08-08 05:21:41 【问题描述】:

我正在使用自定义 LocationSource,它每 300 多毫秒提供一次更新。

您可以在下面观察到坐标更新使蓝点(当前位置)以相当不稳定的方式移动(我移动得很慢以使效果更明显):

如何使蓝点的移动更顺畅,类似于 Google 地图应用程序中的移动?更少的左右晃动和更顺畅的向前移动,而不是从 A 点“跳跃”到 B 点会很棒。

有一些答案建议为相机设置动画或使用插值器在预设时间范围内为 2 个已知位置之间的移动设置动画,但这并不真正适用于我的情况。

【问题讨论】:

只需添加一些animations。 @AndriiOmelchenko 你能说一下你更准确地推荐什么样的动画吗? 您认为在使用自定义LocationSource 的同时可以为“MyLocation”蓝点设置动画吗?或者我真的需要展示我自己的位置标记? “展示我自己的” - 是的。您应该在缓冲区中存储一些位置点(并且可能是平滑路径)并使用自定义“MyLocation”标记和动画。 我正在试用ValueAnimator 【参考方案1】:
Use SnapToRoad Api to get correct co-ordinates from one location to other location.  



 public void animateMarker(int startPositionId, final LatLng toPosition, Marker marker, final boolean hideMarke) 

        final long start = SystemClock.uptimeMillis();
        Projection proj = routeMap.getProjection();
        Point startPoint = proj.toScreenLocation(marker.getPosition());
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final long duration = 1000;

        final Interpolator interpolator = new LinearInterpolator();
        runnable = new Runnable() 
            @Override
            public void run() 
                long elapsed = SystemClock.uptimeMillis() - start;


                float t = interpolator.getInterpolation((float) elapsed
                        / duration);

                Log.d("run:t", String.valueOf(t));

                double lng = t * toPosition.longitude + (1 - t)
                        * startLatLng.longitude;
                double lat = t * toPosition.latitude + (1 - t)
                        * startLatLng.latitude;


                Log.d("run:lat", String.valueOf(lat));
                Log.d("run:lng", String.valueOf(lng));
                marker.setPosition(new LatLng(lat, lng));
             

                if (t < 1.0) 
                    // Post again 16ms later.
                   

                    handlerSetPosition.postDelayed(this, 8);


                 else 
                    if (hideMarke) 
                        marker.setVisible(false);
                     else 
                        marker.setVisible(true);
                        pointId = startPositionId + 1;
                        getSnappedRout(pointId);


                    
                
            
        ;
        handlerSetPosition.post(runnable);

    
    

【讨论】:

也许提一下这个细节会很有用:我的应用程序使用蓝牙信标进行室内定位,所以不幸的是我在使用 Maps API 时受到了很大的限制......

以上是关于如何使用 Google Maps SDK 中的自定义 LocationSource 平滑地为当前位置设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中为 ios 的 google maps sdk 中的地图视图添加标记

如何重新定位或移动 Google Maps SDK 上的当前位置按钮?

在 Google Maps Android SDK (v2) 中更改建筑物颜色

如何更新 Google Maps SDK iOS

如何在 Google Maps Android SDK 的折线上添加形状

Google Maps SDK [Android]:如何获取/设置热图的 MaxIntensity?