【问题标题】:How to animate google map v2 marker on the polyline path?如何在折线路径上为谷歌地图 v2 标记设置动画?
【发布时间】:2014-01-02 02:13:33
【问题描述】:

我已经使用谷歌地图 V2 构建了一个应用程序,并在地图上放置了 2 个标记。第一个标记是获取用户当前位置,第二个标记是用户目标位置。然后我添加 decodePoly 方法在这些标记之间画线。我还添加了使用警报对话框为用户提供有关持续时间、起始地址和目标地址的信息的方法。

所以,当我单击第二个标记时,我想将该标记设置为 “移动” 到第一个标记的动画。但我的问题是,第二个标记没有在折线路径上移动。如下图所示:

这是 MapActivity.java:

@Override
public boolean onMarkerClick(Marker arg0) { // if user click the first marker 

    if(this.lokasi_asli.equals(arg0)){
        AlertDialog.Builder alert = new AlertDialog.Builder(MapActivity.this);
        alert.setTitle("First Position")
            .setIcon(R.drawable.ic_launcher)
            .setCancelable(true)
            .setMessage("First Position : " + "\n" + loc_a)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    dialog.dismiss();
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    dialog.dismiss();
                }
            });
        alert.show();
    } else if (this.lokasi_tujuan.equals(arg0)) { //if user click second marker
        final boolean hideMarker = false;
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        Projection proj = gmap.getProjection();
        Point startPoint = proj.toScreenLocation(lokasi_tujuan.getPosition());
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final long duration = 5000;
        final Interpolator interpolator = new LinearInterpolator();
        handler.post(new Runnable() {

            @Override
            public void run() {
                long elapsed = SystemClock.uptimeMillis() - start;
                float t = interpolator.getInterpolation((float) elapsed / duration);
                double longid = t * lokasi_asli.getPosition().longitude + (1-t) * startLatLng.longitude;
                double latid = t * lokasi_asli.getPosition().latitude + (1-t) * startLatLng.latitude;
                lokasi_tujuan.setPosition(new LatLng(latid, longid));
                if(t < 1.0){
                    //
                    handler.postDelayed(this, 16);
                } else {
                    if(hideMarker){
                        lokasi_tujuan.setVisible(false);
                    } else {
                        lokasi_tujuan.setVisible(true);
                    }
                }
            }

        });

从谷歌地图获取数据:

@Override
    protected void onPostExecute(Void result){
        super.onPostExecute(result);
        if(doc != null){
            NodeList _nodelist = doc.getElementsByTagName("status");
            Node node1 = _nodelist.item(0);
            String _status1 = node1.getChildNodes().item(0).getNodeValue();
            if(_status1.equalsIgnoreCase("OK"))
            {
                NodeList _nodelist_path = doc.getElementsByTagName("overview_polyline");
                Node node_path = _nodelist_path.item(0);
                Element _status_path = (Element)node_path;
                NodeList _nodelist_destination_path = _status_path.getElementsByTagName("points");
                Node _nodelist_dest = _nodelist_destination_path.item(0);
                String _path = _nodelist_dest.getChildNodes().item(0).getNodeValue();
                List<LatLng> directionPoint = decodePoly(_path);

                PolylineOptions rectLine = new PolylineOptions().width(10).color(Color.RED).geodesic(true);
                for (int i = 0; i < directionPoint.size(); i++) 
                {
                    rectLine.add(directionPoint.get(i));
                }

                gmap.addPolyline(rectLine);
                mark_opt.position(new LatLng(dest_lat, dest_long));
                mark_opt.draggable(true);
                mark_opt.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
                lokasi_tujuan = gmap.addMarker(mark_opt);
            } else {
                Toast.makeText(MapActivity.this, "Maaf, Tidak dapat menemukan rute tujuan\nCoba pilih rute lain yang mendekati", Toast.LENGTH_LONG).show();
            }
            progres_dlg.dismiss();
            }
        }
    }

如何使第二个标记在折线路径上移动? 任何想法或帮助将不胜感激。 环境:Windows 7、Eclipse、Genymotion。

【问题讨论】:

  • 您需要编写代码来计算LatLngs 在路径上而不是在两点之间的直线上。
  • @MaciejGórski 你能给我一些样品吗? :)
  • @Marcin Orlowski 如果您能提供帮助,我将不胜感激,我已经尝试修复我的代码但没有找到正确的答案。
  • 你已经被告知你需要做什么来实现你的目标,所以开始工作而不是等待。
  • @marcin 我已经编辑了我的帖子,我想问的是,我应该在我的 fetchData 方法上计算 LatLng 吗?

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


【解决方案1】:

查看教程,该教程展示了如何在地图路线上为标记设置动画。它还提供了 GitHub 中的代码,您也可以试用。

Check HERE

希望这将为您提供指导。

【讨论】:

  • @GrlsHu 我应该先将 actionbar sherlock 添加到我当前的项目中,以便我可以扩展到 SherlockMapFragment 吗?基本上现在我扩展了 FragmentActivity 以打开谷歌地图
  • 是的,你需要先添加actionbar sherlock,然后再扩展SherlockMapFragment。基本上它只会间接分片。
  • @GrlsHu 很抱歉问这个(和我的英语),我可以只使用 FragmentActivity 而不使用 ABS 吗?因为不使用 ABS,我仍然可以显示谷歌地图。现在我的目标是动画第二个标记移动到基于折线路径的第一个标记。我想在 github 上添加一些代码(你提供的链接)到我的项目中,这样我就可以实现那个动画标记。
  • 好吧,不能准确地说出您想要实现的目标。因为我还需要检查那个演示。
【解决方案2】:

看看你是否可以使用marker.setPosition(LatLng)

位置 标记在地图上的位置的 LatLng 值。如果要移动标记,可以随时更改此值。

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2012-12-07
    • 2015-05-12
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多