在谷歌地图v2 android中移动标记

San*_*ull 23 android google-maps-api-2

我在Android谷歌地图v2中进行地图聚类.我只想将标记从一个地理点动画到另一个地理点.有没有办法在谷歌地图v2中移动标记?

San*_*ull 55

在游戏库的示例中有一个在谷歌地图v2演示应用程序中移动标记的示例!!

我调查了那个!! 这里是移动标记的代码: - >

    public void animateMarker(final Marker marker, final LatLng toPosition,
            final boolean hideMarker) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        Projection proj = mGoogleMapObject.getProjection();
        Point startPoint = proj.toScreenLocation(marker.getPosition());
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final long duration = 500;

        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);
                    }
                }
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

希望对每个人都有所帮助!!

  • 这是文件adt-bundle-linux/sdk/extras/google/google_play_services/samples/maps/src/com/example/mapdemo/MarkerDemoActivity.java,如果有人有兴趣(在4.2.2示例中) (5认同)

RxV*_*ent 9

使用ValueAnimator的正确方法:

double[] startValues = new double[]{marker.getPosition().latitude, marker.getPosition().longitude};
double[] endValues = new double[]{destLatLng.latitude, destLatLng.longitude};
ValueAnimator latLngAnimator = ValueAnimator.ofObject(new DoubleArrayEvaluator(), startValues, endValues);
latLngAnimator.setDuration(600);
latLngAnimator.setInterpolator(new DecelerateInterpolator());
latLngAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        double[] animatedValue = (double[]) animation.getAnimatedValue();
        marker.setPosition(new LatLng(animatedValue[0], animatedValue[1]));
    }
});
latLngAnimator.start();
Run Code Online (Sandbox Code Playgroud)

DoubleArrayEvaluatorandroid.animation包中不存在,有我的实现:

import android.animation.TypeEvaluator;

/**
 * Inspired from {@link android.animation.FloatArrayEvaluator}
 * <p/>
 * This evaluator can be used to perform type interpolation between <code>double[]</code> values.
 * Each index into the array is treated as a separate value to interpolate. For example,
 * evaluating <code>{100, 200}</code> and <code>{300, 400}</code> will interpolate the value at
 * the first index between 100 and 300 and the value at the second index value between 200 and 400.
 */
public class DoubleArrayEvaluator implements TypeEvaluator<double[]> {

    private double[] mArray;

    /**
     * Create a DoubleArrayEvaluator that does not reuse the animated value. Care must be taken
     * when using this option because on every evaluation a new <code>double[]</code> will be
     * allocated.
     *
     * @see #DoubleArrayEvaluator(double[])
     */
    public DoubleArrayEvaluator() {
    }

    /**
     * Create a DoubleArrayEvaluator that reuses <code>reuseArray</code> for every evaluate() call.
     * Caution must be taken to ensure that the value returned from
     * {@link android.animation.ValueAnimator#getAnimatedValue()} is not cached, modified, or
     * used across threads. The value will be modified on each <code>evaluate()</code> call.
     *
     * @param reuseArray The array to modify and return from <code>evaluate</code>.
     */
    public DoubleArrayEvaluator(double[] reuseArray) {
        mArray = reuseArray;
    }

    /**
     * Interpolates the value at each index by the fraction. If
     * {@link #DoubleArrayEvaluator(double[])} was used to construct this object,
     * <code>reuseArray</code> will be returned, otherwise a new <code>double[]</code>
     * will be returned.
     *
     * @param fraction   The fraction from the starting to the ending values
     * @param startValue The start value.
     * @param endValue   The end value.
     * @return A <code>double[]</code> where each element is an interpolation between
     * the same index in startValue and endValue.
     */
    @Override
    public double[] evaluate(float fraction, double[] startValue, double[] endValue) {
        double[] array = mArray;
        if (array == null) {
            array = new double[startValue.length];
        }

        for (int i = 0; i < array.length; i++) {
            double start = startValue[i];
            double end = endValue[i];
            array[i] = start + (fraction * (end - start));
        }
        return array;
    }
}
Run Code Online (Sandbox Code Playgroud)


Hir*_*tel 6

我是这样做的:

private Marker marker;
Run Code Online (Sandbox Code Playgroud)

虽然添加 标记谷歌地图:

if(marker!=null){
   marker.remove();
 }

LatLng mLatLng = new LatLng(Your_Latitude, Your_Longitude);

marker = mMapHistory.addMarker(new MarkerOptions().position(mLatLng).title("My Title").snippet("My Snippet").icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher)));
Run Code Online (Sandbox Code Playgroud)

希望这个最简单的方法能帮到你。

  • 这将简单地使用新标记更新标记的位置,但不会为地图上的标记设置动画。 (7认同)

Mad*_*ddy 5

请尝试这个:

    private static void addMarkerWithCameraZooming(Context ctx, GoogleMap googleMap, double latitude, double longitude, String title, boolean dragabble) {
            LatLng current_latlng = new LatLng(latitude, longitude);
            googleMap.addMarker(new MarkerOptions().position(current_latlng)
                    .title(title)
                    .snippet(getLocality(current_latlng, ctx))
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.person_marker))
                    .draggable(dragabble)
                              );
            CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(latitude, longitude)).zoom(12).tilt(30).build();
            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
        }

mGoogleMap.setOnMarkerDragListener(new OnMarkerDragListener() {
            @Override
            public void onMarkerDragStart(Marker markerDragStart) {
                // TODO Auto-generated method stub
                if (BuildConfig.DEBUG)
                Log.i("Marker drag", "start");
            }

            @Override
            public void onMarkerDragEnd(Marker markerDragEnd) {
                if (BuildConfig.DEBUG)
                    Log.i("Marker drag", "start");
            }

            @Override
            public void onMarkerDrag(Marker markerDrag) {
                if (BuildConfig.DEBUG)
                    Log.i("Marker drag", "start");
            }
        });
Run Code Online (Sandbox Code Playgroud)