像 Uber Android 一样在地图上旋转标记和移动动画

2024-03-22

我正在从事一个类似于 UBER、Lyft 或 OLA 的项目。家里的地图上有可用的移动汽车。 我正在寻找某种图书馆,它可以让汽车像 UBER 一样顺利移动和转弯。现在,我可以使用下面的代码将汽车从一个经纬度平稳地移动到另一个纬度经度。但棘手的部分是转弯并确保汽车在转向时面向前方。

平稳移动小车代码:

    final LatLng SomePos = new LatLng(12.7796354, 77.4159606);

    try {
        if (googleMap == null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
            }
        }
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.setMyLocationEnabled(true);
        googleMap.setTrafficEnabled(false);
        googleMap.setIndoorEnabled(false);
        googleMap.setBuildingsEnabled(true);
        googleMap.getUiSettings().setZoomControlsEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(SomePos));
        googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()
                .target(googleMap.getCameraPosition().target)
                .zoom(17)
                .bearing(30)
                .tilt(45)
                .build()));

        myMarker = googleMap.addMarker(new MarkerOptions()
                .position(SomePos)
                .icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher))
                .title("Hello world"));


        googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker arg0) {

                final LatLng startPosition = myMarker.getPosition();
                final LatLng finalPosition = new LatLng(12.7801569, 77.4148528);
                final Handler handler = new Handler();
                final long start = SystemClock.uptimeMillis();
                final Interpolator interpolator = new AccelerateDecelerateInterpolator();
                final float durationInMs = 3000;
                final boolean hideMarker = false;

                handler.post(new Runnable() {
                    long elapsed;
                    float t;
                    float v;

                    @Override
                    public void run() {
                        // Calculate progress using interpolator
                        elapsed = SystemClock.uptimeMillis() - start;
                        t = elapsed / durationInMs;

                        LatLng currentPosition = new LatLng(
                                startPosition.latitude * (1 - t) + finalPosition.latitude * t,
                                startPosition.longitude * (1 - t) + finalPosition.longitude * t);

                        myMarker.setPosition(currentPosition);

                        // Repeat till progress is complete.
                        if (t < 1) {
                            // Post again 16ms later.
                            handler.postDelayed(this, 16);
                        } else {
                            if (hideMarker) {
                                myMarker.setVisible(false);
                            } else {
                                myMarker.setVisible(true);
                            }
                        }
                    }
                });

                return true;

            }

        });

    } catch (Exception e) {
        e.printStackTrace();
    }

我最近遇到了同样的用例。这是我的解决方案。

首先,我要感谢@VipiN 分享“平滑移动汽车代码”。它工作顺利。

第二部分是将车标放置在正确的方向并按顺序旋转。为了实现这一目标,我计算了两个连续点之间的方位角或航向角(即您从设备/服务器收到的位置更新)。这link http://www.igismap.com/formula-to-find-bearing-or-heading-angle-between-two-points-latitude-longitude/将帮助您理解其背后的数学原理。

以下代码将为您提供两个位置之间的方位:

private double bearingBetweenLocations(LatLng latLng1,LatLng latLng2) {

    double PI = 3.14159;
    double lat1 = latLng1.latitude * PI / 180;
    double long1 = latLng1.longitude * PI / 180;
    double lat2 = latLng2.latitude * PI / 180;
    double long2 = latLng2.longitude * PI / 180;

    double dLon = (long2 - long1);

    double y = Math.sin(dLon) * Math.cos(lat2);
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
            * Math.cos(lat2) * Math.cos(dLon);

    double brng = Math.atan2(y, x);

    brng = Math.toDegrees(brng);
    brng = (brng + 360) % 360;

    return brng;
}

最后,我们需要将汽车标记旋转我们从上述方法获得的角度。

private void rotateMarker(final Marker marker, final float toRotation) {
    if(!isMarkerRotating) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        final float startRotation = marker.getRotation();
        final long duration = 1000;

        final Interpolator interpolator = new LinearInterpolator();

        handler.post(new Runnable() {
            @Override
            public void run() {
                isMarkerRotating = true;

                long elapsed = SystemClock.uptimeMillis() - start;
                float t = interpolator.getInterpolation((float) elapsed / duration);

                float rot = t * toRotation + (1 - t) * startRotation;

                marker.setRotation(-rot > 180 ? rot / 2 : rot);
                if (t < 1.0) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16);
                } else {
                    isMarkerRotating = false;
                }
            }
        });
    }
}

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

像 Uber Android 一样在地图上旋转标记和移动动画 的相关文章

随机推荐

  • 将 SparkSession.sql() 与 JDBC 结合使用

    问题 我想使用 JDBC 连接来使用 Spark 发出自定义请求 此查询的目标是优化工作人员的内存分配 因为我无法使用 ss read format jdbc option url jdbc postgresql dbserver opti
  • 在 Grunt 中使用全局变量设置构建输出路径

    我有几个繁重的任务 我试图在这些任务之间共享全局变量 但我遇到了问题 我编写了一些自定义任务 它们根据构建类型设置正确的输出路径 这似乎是正确的设置 Set Mode local or build grunt registerTask se
  • 使用正则表达式设置任何字符的最小/最大字符数

    我正在尝试编写一个正则表达式 用于文本框来验证其内容是否在 1 到 35 之间 文本框中的字符可以是任何内容 数字 字母 标点符号 空格等 到目前为止 这是我所拥有的 0 9a zA Z s 1 35 正如你所看到的 我必须列出所有角色 有
  • 使用 TfidfVectorizer scikit-learn 的自定义词汇表时出现问题

    我尝试在 scikit learn 中使用自定义词汇来执行一些聚类任务 但得到了非常奇怪的结果 当不使用自定义词汇表时 程序运行正常 我对集群创建感到满意 不过 我已经确定了一组我想用作自定义词汇表的单词 大约 24 000 个 这些单词存
  • 在不同数据类型之间交替

    我正在尝试解决这个问题 但这真的让我很烦恼 我有一个函数可以将数组或向量转换为复数向量 但是 我不知道该函数如何能够接受双精度数组和双精度向量 我尝试过使用模板 但是 这似乎不起作用 template template
  • 使用 intel pintool 记录所有指令

    我写了这个pintool include pin H include
  • VS2008调试器挂起

    我正在使用带有 SP1 的 Visual Studio 2008 Team System 并且我注意到每当我停止调试应用程序时 IDE 都会挂起几 10 15 秒 这很烦人 起初我以为这只发生在 WPF 应用程序中 但我也观察到了 Wind
  • Android TextView 文本不会居中

    我正在尝试进行 PIN 输入活动 但有一点不太适合我 我无法将文本置于屏幕截图顶部 TextView 的中心 它的工作方式是当用户输入 PIN 时 我将在每个 TextView 中放置一个星号以获取可见的反馈 问题是 我希望星星居中 我尝试
  • Eclipse + Ubuntu 箭头键和退格键不起作用

    我正在使用 Ubuntu 12 10 和 Eclipse Juno 这种情况经常发生 箭头键和退格键在编辑器中停止工作 解决该问题的唯一方法是重新启动计算机 重新启动 Eclipse 没有帮助 有人遇到过这个问题或者知道解决方案吗 谢谢 更
  • 生成签名 apk 任务 app:packageRelease 时出错

    错误 任务 app packageRelease 的配置出现问题 为属性 resourceFile 指定的文件 Volumes Data Android apps NammaKarnataka master app build interm
  • 使用 SessionLoginSample 时特定帐户的 OAuthException 代码 #2

    我们遇到了一个非常奇怪的情况 其中特定的 Facebook 帐户在成功登录后对 https graph facebook com me friends access token XXX 的请求失败 在我们的应用程序中发现这种情况后 我验证了
  • 根据您的最低稳定性设置,该软件包没有足够稳定的版本

    我不太明白 Composer 如何在最低稳定性设置下工作 我有两个包裹 比方说 PackageA and PackageB The composer json文件的PackageA看起来像这样 name vendor packagea mi
  • INNER JOIN 能否提供比 EXISTS 更好的性能

    我一直在研究如何改进一系列过程的性能 最近一位同事提到 他在使用 INNER JOIN 代替 EXISTS 时取得了显着的性能改进 作为调查原因的一部分 我想我会在这里问这个问题 So INNER JOIN 能否提供比 EXISTS 更好的
  • python urllib2文件发送问题

    我想通过 python 将文件发布到服务器 为此我需要将此文件命名为 xmlfile 以便服务器识别输入 import urllib2 url http somedomain to send open test xml read data
  • 在 Backbone 渲染方法中调用 jQuery 插件

    我在 Backbone 中有一个渲染方法 基本上是这样的 render function tmpl this template attrs appendTo this el return this 这是从路由器操作中调用的 action f
  • Azure-runbook 中的 New-PSSession (ARM)

    对于经典门户 ASM 中的 Azure VM 我能够获得 所需的凭据Get AutomationPSCredential and the ConnectionURI with Connect AzureVM ps1 https galler
  • vh 单元行为不一致

    我有一个伪元素 悬停时出现 height 0 4vh 高度不会改变 只有宽度会改变 然而 由于某种原因 在某些条件下 不同伪元素的高度不同 这里的两条深色线都有height 0 4vh 我用这个小提琴来演示 但意识到这种奇怪的情况是否发生取
  • 无法获取已安装模块的绝对路径

    我遇到了一个问题 我认为这与我的 package json 或 cordova 平台的版本有关 当我尝试运行ionic state restore它返回以下输出 Attempting to restore your Ionic applic
  • HTML5代码元素-语言类

    HTML5 code 元素有一个可选的 class language 属性 https html spec whatwg org multipage semantics html the code element定义代码片段的语言 规范中的
  • 像 Uber Android 一样在地图上旋转标记和移动动画

    我正在从事一个类似于 UBER Lyft 或 OLA 的项目 家里的地图上有可用的移动汽车 我正在寻找某种图书馆 它可以让汽车像 UBER 一样顺利移动和转弯 现在 我可以使用下面的代码将汽车从一个经纬度平稳地移动到另一个纬度经度 但棘手的