当我们在谷歌地图android上有位置列表时,如何将标记从一个位置移动到另一个位置
我正在创建带有多个标记的谷歌地图。现在我想在这些标记之间移动一个汽车图标。使用 我可以在第一个点到第二个点之间移动汽车图标。但它不会从第二个点移动到第三个点。当我使用for循环时,它会快速移动到最后一个点。我还添加了延迟,但没有其他东西对我有效 提前谢谢 这是我的代码::当我们在谷歌地图android上有位置列表时,如何将标记从一个位置移动到另一个位置,android,google-maps,Android,Google Maps,我正在创建带有多个标记的谷歌地图。现在我想在这些标记之间移动一个汽车图标。使用 我可以在第一个点到第二个点之间移动汽车图标。但它不会从第二个点移动到第三个点。当我使用for循环时,它会快速移动到最后一个点。我还添加了延迟,但没有其他东西对我有效 提前谢谢 这是我的代码:: public void setAnimation(GoogleMap myMap, final List<LatLng> directionPoint) { anim_map = myMap;
public void setAnimation(GoogleMap myMap, final List<LatLng> directionPoint) {
anim_map = myMap;
anim_marker = myMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_icon))
.position(directionPoint.get(0))
.flat(true));
myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(directionPoint.get(0), 10));
if (directionPoint.size() >= 2) {
for (int i = 0; i < directionPoint.size() - 1; i++) {
h.post(new Runnable() {
@Override
public void run() {
animateMarker(anim_map, anim_marker, directionPoint, false);
}
});
}
}
}
private void animateMarker(GoogleMap myMap, final Marker marker, final List<LatLng> directionPoint,
final boolean hideMarker) {
final long start = SystemClock.uptimeMillis();
final long duration = 350000;
final Interpolator interpolator = new LinearInterpolator();
h.post(new Runnable() {
int i = 0;
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed
/ duration);
// Log.e("T Location", t + "");
double lng = t * directionPoint.get(i + 1).longitude + (1 - t) * directionPoint.get(i).longitude;
double lat = t * directionPoint.get(i + 1).latitude + (1 - t) * directionPoint.get(i).latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
h.postDelayed(this, 1);
} else {
if (hideMarker) {
marker.setVisible(false);
} else {
marker.setVisible(true);
}
}
}
});
}
public void setAnimation(谷歌地图myMap,最终列表方向点){
动画地图=我的地图;
anim_marker=myMap.addMarker(新的MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_图标))
.位置(方向点.get(0))
.平坦(真实));
myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(directionPoint.get(0),10));
if(directionPoint.size()>=2){
对于(int i=0;i
您可以尝试这种方法,使标记在谷歌地图中移动
类似于实时驾驶方向跟踪
private Marker mCurrentMarker;
private float ZOOMLEVEL=18.0f;
private LatLng previousLatLon;
private Handler mLocalHandler;
private GoogleMap mGoogleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocalHandler = new Handler();
previousLatLon=new LatLng(45.320372, 2.460161);
//Initialize Marker once Google Map object is created
mMarkerOptions = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.custom_marker_icon));
mMarkerOptions.position(previousLatLon);
mCurrentMarker = mGoogleMap.addMarker(mMarkerOptions);
}
/**
* Call this method to move marker in map to new location in map with updated location
* @param marker
* @param toPosition
* @param fromPosition
*/
public void animateMarker(final Marker marker, final LatLng toPosition,final LatLng fromPosition) {
final long duration = 500;
final Interpolator interpolator = new LinearInterpolator();
mLocalHandler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - mStartTime;
float t = interpolator.getInterpolation((float) elapsed
/ duration);
marker.setPosition(toPosition);
marker.setAnchor(Constants.MAPANCHOR, Constants.MAPANCHOR);
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(toPosition, ZOOMLEVEL));
if (t < 1.0) {
// Post again 16ms later.
mLocalHandler.postDelayed(this, 16);
} else {
marker.setVisible(true);
}
}
}
});
previousLatLon=toPosition;// reassign the previous location to current location
}
专用标记mCurrentMarker;
私人浮动ZOOMLEVEL=18.0f;
私人车床;
私人处理程序Mlocahandler;
私有谷歌地图mGoogleMap;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mLocalHandler=新处理程序();
以前的车床=新车床(45.320372,2.460161);
//创建Google地图对象后初始化标记
mMarkerOptions=new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.custom_marker_icon));
m标记位置(以前的Latlon);
mCurrentMarker=mGoogleMap.addMarker(mMarkerOptions);
}
/**
*调用此方法将地图中的标记移动到地图中具有更新位置的新位置
*@param标记
*@param位置
*@param fromPosition
*/
公共空白动画标记器(最终标记器、最终板条位置、最终板条起始位置){
最终长持续时间=500;
最终插值器插值器=新的线性插值器();
mLocalHandler.post(新的Runnable(){
@凌驾
公开募捐{
长时间运行=SystemClock.uptimeMillis()-mStartTime;
float t=interpolator.getInterpolation((float)经过
/持续时间);
标记器。设置位置(位置);
marker.setAnchor(Constants.MAPANCHOR,Constants.MAPANCHOR);
mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(地形、缩放级别));
如果(t<1.0){
//16毫秒后再次发布。
mLocalHandler.postDelayed(这个,16);
}否则{
marker.setVisible(true);
}
}
}
});
previousLatLon=位置;//将以前的位置重新指定给当前位置
}
详细阅读我的答案
在您的例子中,在for循环之后放置睡眠几毫秒
for (int i = 0; i < directionPoint.size() - 1; i++) {
try {
Thread.sleep(5000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
// rest of your code
for(int i=0;i
最后,我想出了这个答案。
我们必须更新与arraylist大小相关的所有值
public void setAnimation(GoogleMap myMap, final List<LatLng> directionPoint) {
anim_map = myMap;
anim_marker = myMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_icon))
.position(directionPoint.get(0))
.flat(true));
myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(directionPoint.get(0), 10));
animateMarker(anim_map, anim_marker, directionPoint, false);
}
private void animateMarker(GoogleMap myMap, final Marker marker, final List<LatLng> directionPoint,
final boolean hideMarker) {
final long start = SystemClock.uptimeMillis();
long duration = 3500;
final Interpolator interpolator = new LinearInterpolator();
float t = 0;
for (int j = 0; j < directionPoint.size() - 1; j++) {
Log.e("Location Value", j + " " + directionPoint.get(j).latitude + ", " + directionPoint.get(j).longitude + " : " + directionPoint.get(j + 1).latitude + ", " + directionPoint.get(j + 1).longitude);
while (t < j + 1) {
t = t - j;
double lng = t * directionPoint.get(j + 1).longitude + (1 - t) * directionPoint.get(j).longitude;
double lat = t * directionPoint.get(j + 1).latitude + (1 - t) * directionPoint.get(j).latitude;
LatList.add(new LatLng(lat, lng));
long elapsed = SystemClock.uptimeMillis() - start;
t = interpolator.getInterpolation((float) elapsed / duration);
}
}
Log.e("LatList value", LatList.size() + "");
h.post(new Runnable() {
int i = 0;
@Override
public void run() {
marker.setPosition(LatList.get(i));
if ((LatList.size() - 1) > i)
h.postDelayed(this, 1);
Log.e("I value", i + "");
i++;
}
});
}
public void setAnimation(谷歌地图myMap,最终列表方向点){
动画地图=我的地图;
anim_marker=myMap.addMarker(新的MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_图标))
.位置(方向点.get(0))
.平坦(真实));
myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(directionPoint.get(0),10));
动画标记器(动画地图、动画标记、方向点、假);
}
私有void animateMarker(谷歌地图myMap、最终标记、最终列表方向点、,
最终布尔hideMarker){
最终长启动=SystemClock.uptimeMillis();
长持续时间=3500;
最终插值器插值器=新的线性插值器();
浮动t=0;
对于(int j=0;j