如何在Google地图V2的折线路径上为标记添加动画效果?

6
我已经使用Google Maps 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。


1
你需要编写代码来计算路径上的 LatLng,而不是两点之间的直线。 - MaciejGórski
@MaciejGórski,你能给我一些样例吗? :) - Hendy
@Marcin Orlowski,如果您能帮忙,我将不胜感激。我已经尝试修复我的代码,但没有找到正确的答案。 - Hendy
你已经被告知实现目标需要做什么,所以开始行动而不是等待。 - Marcin Orlowski
@marcin 我已经编辑了我的帖子,我想问的是,在我的fetchData方法中,我应该计算LatLng吗? - Hendy
https://github.com/amalChandran/google-maps-route-animation - amalBit
2个回答

5

请查看这份教程,它展示了如何在地图路线上对标记进行动画处理。此外,它还在 GitHub 上提供了代码,你可以尝试一下。

点击此处查看。

希望这能为您提供指导。


@GrlsHu 我应该先将ActionBarSherlock添加到我的当前项目中,以便我可以扩展到SherlockMapFragment吗?基本上现在我正在扩展FragmentActivity以打开Google地图。 - Hendy
是的,你需要先添加actionbar sherlock,然后才能继承SherlockMapFragment。基本上它只会间接地成为Fragment。 - GrIsHu
@GrlsHu 抱歉问这个问题(我英语也不太好),我能只使用FragmentActivity而不使用ABS吗?因为即使不使用ABS,我仍然能够显示谷歌地图。现在我的目标是根据折线路径将第二个标记器动态移动到第一个标记器。我想将您提供的GitHub链接中的一些代码添加到我的项目中,以便我可以实现该动画标记器。 - Hendy
不能确切地说你想要实现的东西。因为我还需要检查那个演示。 - GrIsHu

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接