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

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

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

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

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

【问题讨论】:

  • 只需添加一些animations
  • @AndriiOmelchenko 你能说一下你更准确地推荐什么样的动画吗?
  • 您认为在使用自定义LocationSource 的同时可以为“MyLocation”蓝点设置动画吗?或者我真的需要展示我自己的位置标记?
  • “展示我自己的” - 是的。您应该在缓冲区中存储一些位置点(并且可能是平滑路径)并使用自定义“MyLocation”标记和动画。
  • 我正在试用ValueAnimator

标签: android google-maps google-maps-markers google-maps-android-api-2 google-maps-api-2


【解决方案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 时受到了很大的限制......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多