2012-12-05 37 views

回答

50

有一个移动标记在谷歌地图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); 
        } 
       } 
      } 
     }); 
    } 

希望它能帮助每一个!

+2

检查我的答案,我刚刚发布 –

+5

这是文件ADT-包-linux/sdk/extras/google/google_play_services/samples/maps/src/com/example/mapdemo/MarkerDemoActivity.java如果有人感兴趣(在4.2.2示例中) –

+1

是的..它在那里。 –

3

请试试这个:

private Marker marker; 

虽然谷歌地图加入标记

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))); 
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"); 
      } 
     }); 
4

我已经在这样做的话希望这个最简单的方法能帮助你。

与ValueAnimator
+0

这将只更新标记的位置,但不在地图上标记标记。 –

+0

您可以使用:marker.setPosition(mLatLng); – n8yn8

7

有道:

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

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

U挽救了我的一天兄弟。 – RameshJaga