How to animate google map v2 marker on the polyline path?
Asked Answered
H

1

6

I already build an app using google maps V2 and put 2 markers on the map. First marker is to get user current location, and the second marker is user destination location. And then I add decodePoly method to draw line between those markers. I also add method to give user information about durations,start address and destination address using alert dialog.

route

So, when I click the second marker, i want to animate that marker to "move" to first marker. But my problem is, the second marker is not moving on the polyline path. you can see at image below:

result

This is 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);
                    }
                }
            }

        });

fetch data from google map:

@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();
            }
        }
    }

How can i make the second marker move on the polyline path?? Any ideas or help would be greatly appreciated. Environment : Windows 7, Eclipse, Genymotion.

Hanson answered 14/12, 2013 at 8:39 Comment(6)
You need to write code that will calculate LatLngs on the path and not on a straight line between two points.Takamatsu
@MaciejGórski can you give me some sample ? :)Hanson
@Marcin Orlowski i will be grateful if you can help, i already try to fix my code but not found the correct answer.Hanson
You already been told what you need to do to achieve your goal, so start working instead of waiting.Intracutaneous
@marcin i already edited my post, what i want to ask, is it on my fetchData method i should calculate LatLng's ?Hanson
github.com/amalChandran/google-maps-route-animationBrote
B
1

See If you can use marker.setPosition(LatLng)

Position The LatLng value for the marker's position on the map. You can change this value at any time if you want to move the marker.

Blockhouse answered 14/12, 2013 at 8:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.