如何在android中的地图上的两个位置之间的路径上移动图像

时间:2017-01-24 12:09:24

标签: android google-maps

我正在开展一个项目,其中我展示了两个随机位置和它们之间的路径。我使用this教程来完成。

现在我想将动态图像从一个位置显示到另一个位置。我已经在这两个位置放置了标记。而且我已经将位置保存在一个arraylist中。

我找到了一些相似的帖子,但无法解决我的问题。

这是我移动drawable的代码:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            final Handler handler = new Handler();
            int i = 0;

            @Override
            public boolean onMarkerClick(Marker marker) {
                // System.out.println("Marker size:- " + MarkerPoints.size());
                handler.post(new Runnable() {

                    @Override
                    public void run() {

                        BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.truck_16);

                        while (i < MarkerPoints.size()) {
                            MarkerOptions markerOptions = new MarkerOptions().position(MarkerPoints.get(i))
                                    .title("Current Location")
                                    icon(icon);

                            System.out.println(MarkerPoints.get(i));
                            mMap.addMarker(markerOptions);
                            i++;
                            handler.postDelayed(this, 3000);
                        }
                    }
                });

                return true;
            }
        });

3 个答案:

答案 0 :(得分:0)

   private double bearingBetweenLocations(LatLng latLng1, LatLng latLng2) {
    final double PI = 3.14159;
    final double lat1 = latLng1.latitude * PI / 180;
    final double long1 = latLng1.longitude * PI / 180;
    final double lat2 = latLng2.latitude * PI / 180;
    final double long2 = latLng2.longitude * PI / 180;

    final double dLon = (long2 - long1);

    final double y = Math.sin(dLon) * Math.cos(lat2);
    final 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;
}

答案 1 :(得分:0)

假设您有当前和目标坐标,如下所示。

private LatLng CURRENT_LOC = new LatLng(23.013171, 72.522300);
private LatLng DESTINATION_LOC = new LatLng(23.013481, 72.522496);

之后在谷歌地图上添加标记

if (googleMap != null)
{
    BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.truck_16);

    MarkerOptions current = new MarkerOptions().position(CURRENT_LOC).title("Current Point");
    current_marker = googleMap.addMarker(current);
    current_marker.setIcon(icon);
    current_marker.setFlat(true);

    MarkerOptions destination = new MarkerOptions().position(DESTINATION_LOC).title("Destination Point");
    destination_marker = googleMap.addMarker(destination);
    destination_marker.setFlat(true);
}

点击

移动标记
@Override
public void onClick(View v)
{
    switch (v.getId())
    {
        case R.id.btn_move:

        float rotate = (float) bearingBetweenLocations(CURRENT_LOC, DESTINATION_LOC);

        rotateMarker(rotate);

        break;
    }
}

下面是将标记从当前位置移动到目标位置的方法

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;
}

public void rotateMarker(float rotate)
{
    if (current_marker != null)
    {
        //final LatLngInterpolator latLngInterpolator = new LatLngInterpolator.LinearFixed();
        ValueAnimator valueAnimator = new ValueAnimator();
        //final LatLng startPosition = current_marker.getPosition();
        final float startRotation = current_marker.getRotation();
        final float angle = 180 - Math.abs(Math.abs(startRotation - rotate) - 180);
        final float right = WhichWayToTurn(startRotation, rotate);

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
        {
            @Override
            public void onAnimationUpdate(ValueAnimator animation)
            {
                try
                {
                    if (current_marker == null) // oops... destroying map during animation...
                    {
                        return;
                    }
                    float v = animation.getAnimatedFraction();
                    //newPosition = latLngInterpolator.interpolate(v, startPosition, toLatLng(location));
                    float rotation = startRotation + right * v * angle;
                    current_marker.setRotation(rotation);
                    //current_marker.setPosition(newPosition);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });

        valueAnimator.addListener(new AnimatorListenerAdapter()
        {
            @Override
            public void onAnimationEnd(Animator animation)
            {
                //current_marker.setPosition(newPosition);
                animateMarker(current_marker, DESTINATION_LOC, false);
            }
        });

        valueAnimator.setFloatValues(0, 1);
        valueAnimator.setDuration(1000);
        valueAnimator.start();
    }
}

public void animateMarker(final Marker marker, final LatLng toPosition, final boolean hideMarker)
{
    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    Projection proj = googleMap.getProjection();
    Point startPoint = proj.toScreenLocation(marker.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 lng = t * toPosition.longitude + (1 - t) * startLatLng.longitude;
            double lat = t * toPosition.latitude + (1 - t) * startLatLng.latitude;
            marker.setPosition(new LatLng(lat, lng));

            if (t < 1.0) {
                // Post again 16ms later.
                handler.postDelayed(this, 16);
            } else {
                if (hideMarker) {
                    marker.setVisible(false);
                } else {
                    marker.setVisible(true);
                }
            }
        }
    });
}

private float WhichWayToTurn(float currentDirection, float targetDirection)
{
    float diff = targetDirection - currentDirection;
    if (Math.abs(diff) == 0)
    {
        return 0;
    }
    if(diff > 180)
    {
        return -1;
    }
    else
    {
        return 1;
    }
}

希望这会对你有所帮助。

答案 2 :(得分:0)

最后我找到了一种方法来实现这一点。可能这不是最好的方法,但它解决了问题。我发布这个以后如果有人需要做那样的事情,它可能会有所帮助。

我已将所有点存储在一个名为MarkerPoints的ArrayList中,我们从API中获取并使用它来绘制图像。

以下是代码:

public class MyActivity extends FragmentActivity implements Runnable
{
private Thread thread = null;
volatile boolean isRunning;
private ArrayList<LatLng> MarkerPoints; //This arrayList contains all points that are on the route
int i = 0;
Marker marker;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_on_trip_maps);

        isRunning = true;
    }

    @Override
    public void run() {

        while (isRunning) {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    update();
                }
            });

            control();

        }
    }

    public void update() {

        if (marker != null) {
            marker.remove();
        }
        BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.truck_16);
        marker = mMap.addMarker(new MarkerOptions().position(MarkerPoints.get(i))
                .title("Current Location")
                .icon(icon));

        System.out.println(MarkerPoints.get(i));
        i++;
        if (i > MarkerPoints.size() - 1) {
            isRunning = false;

        }
    }

    public void control() {
        try {
            thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


}

这将产生移动效果。