我在做Android的谷歌地图V2地图集群。 我只是想标记动画从一个GeoPoint对象到另一个。 是否有移动的谷歌地图V2标记的方法吗?
Answer 1:
有一个在谷歌地图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);
}
}
}
});
}
希望它能帮助每一个!
Answer 2:
正确的方法与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();
DoubleArrayEvaluator
不存在android.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;
}
}
Answer 3:
请试试这个:
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");
}
});
Answer 4:
我已经在这样做的话:
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)));
希望这最简单的方法会帮助你。
Answer 5:
您好我有同样的问题,在这里我的帖子谷歌地图的Android API V2和当前位置
您可以使用标记的remove()方法用新删除旧的标记。 我希望这是你需要什么
文章来源: Move markers in google map v2 android