【发布时间】:2014-04-21 18:39:23
【问题描述】:
我正在使用 Google Maps API V2 获取当前用户的位置,并使用 onLocationChanged 监听器记录他的路线。当用户记录他们的路线时,我将在每个位置更改时检测到的所有 LatLngs 保存在一个数组列表中。当用户停止记录他们的路线时,我在数组列表的第一个点放置一个标记。我现在的问题是我希望通过arraylist 中的所有点为标记设置动画。谁能告诉我该怎么做?
需要注意的是数组不需要排序,因为我记录了点的到来。我尝试使用 for 循环循环遍历数组并发送值,但我从
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
说“未知来源”以及 NullPointer 异常。
这是我的代码:
case R.id.action_replay:
int o;
for(o=0; o<oldlocPoints.size(); ++o){
if(--o > 1){lastPos = oldlocPoints.get(--o);}
toPos = oldlocPoints.get(++o);
animateMarker(markerStart, lastPos, toPos);
}
return true;
这就是我尝试通过标记制作动画的方式。我遇到的主要困难是在 run() 中它似乎只需要 Final 类型的值,所以我不知道如何取悦它。
//Animates marker through the locations saved from the recorded route
public void animateMarker(final Marker marker, LatLng lastPos, final LatLng toPos) {
final long duration = 1600;
final Handler handler = new Handler();
this.lastPos = lastPos;
this.toPos = toPos;
final long start = SystemClock.uptimeMillis();
final int o;
Projection proj = map.getProjection();
Point startPoint = proj.toScreenLocation(lastPos);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
Log.d(TAG, "" + lastPos + "" + toPos);
final Interpolator interpolator = new AccelerateDecelerateInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng = t * toPos.longitude + (1 - t) * startLatLng.longitude;
double lat = t * toPos.latitude + (1 - t) * startLatLng.latitude;
markerStart.setPosition(new LatLng(lat, lng));
//markerStart.setPosition(interpolator.interpolate(t, target, replayEnd));
if (t < 1.0) {
//Post again 16ms later == 60 frames per second
handler.postDelayed(this, 32);
} else {
//Animation ended
}
}
});
}
有人可以帮帮我吗?
更新 我迄今为止最接近的尝试是这样的:
while (i<oldlocPoints.size()){
final long duration = 32;
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = map.getProjection();
final LatLng toPos = oldlocPoints.get(i/3);
Point startPoint = proj.toScreenLocation(oldlocPoints.get(i));
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final Interpolator interpolator = new AccelerateDecelerateInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng = t * toPos.longitude + (1 - t) * startLatLng.longitude;
double lat = t * toPos.latitude + (1 - t) * startLatLng.latitude;
markerStart.setPosition(new LatLng(lat, lng));
//markerStart.setPosition(interpolator.interpolate(t, target, replayEnd));
if (t < 1.0) {
//Post again 16ms later == 60 frames per second
handler.postDelayed(this, 32);
} else {
//Animation ended
}
}
});
i++;
}
【问题讨论】:
-
FWIW,这是一个示例应用程序,我在其中为位置之间的标记设置动画:github.com/commonsguy/cw-omnibus/tree/master/MapsV2/Animator
-
除了 CommonsWare 的示例(考虑到它是 CommonsWare 可能很好),您可能需要查看左侧选项卡中的 developers.google.com/maps/documentation/android/intro,它在地图上绘制帮助标记和更改视图,这将帮助您确保视图保持居中。
-
@zgc7009 我之前确实看过那些,直到他们说'newPosition.setPosition(latLngInterpolator.interpolate(v,startPos,endPos));'我不知道 latLngInterpolator 是什么或它来自哪里。我确实尝试在我的代码中实现它,但是当我看到这不是导入时,我认为这是我没有的一些类。
-
@CommonsWare 恐怕你的代码有点过头了,我不是 android 专家 :(。我没有得到属性变量和 LatLngEvaluator。你能帮帮我吗了解他们吗?
-
嗯,对于 StackOverflow 问题,您要问的内容有点复杂——a book 中有几页。该技术来自this DevBytes YouTube video,它将审查
LatLngEvaluator等。
标签: android arraylist location google-maps-api-2 marker