【发布时间】:2014-01-02 02:13:33
【问题描述】:
我已经使用谷歌地图 V2 构建了一个应用程序,并在地图上放置了 2 个标记。第一个标记是获取用户当前位置,第二个标记是用户目标位置。然后我添加 decodePoly 方法在这些标记之间画线。我还添加了使用警报对话框为用户提供有关持续时间、起始地址和目标地址的信息的方法。
所以,当我单击第二个标记时,我想将该标记设置为 “移动” 到第一个标记的动画。但我的问题是,第二个标记没有在折线路径上移动。如下图所示:
这是 MapActivity.java:
@Override
public boolean onMarkerClick(Marker arg0) { // if user click the first marker
if(this.lokasi_asli.equals(arg0)){
AlertDialog.Builder alert = new AlertDialog.Builder(MapActivity.this);
alert.setTitle("First Position")
.setIcon(R.drawable.ic_launcher)
.setCancelable(true)
.setMessage("First Position : " + "\n" + loc_a)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alert.show();
} else if (this.lokasi_tujuan.equals(arg0)) { //if user click second marker
final boolean hideMarker = false;
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = gmap.getProjection();
Point startPoint = proj.toScreenLocation(lokasi_tujuan.getPosition());
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final long duration = 5000;
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 longid = t * lokasi_asli.getPosition().longitude + (1-t) * startLatLng.longitude;
double latid = t * lokasi_asli.getPosition().latitude + (1-t) * startLatLng.latitude;
lokasi_tujuan.setPosition(new LatLng(latid, longid));
if(t < 1.0){
//
handler.postDelayed(this, 16);
} else {
if(hideMarker){
lokasi_tujuan.setVisible(false);
} else {
lokasi_tujuan.setVisible(true);
}
}
}
});
从谷歌地图获取数据:
@Override
protected void onPostExecute(Void result){
super.onPostExecute(result);
if(doc != null){
NodeList _nodelist = doc.getElementsByTagName("status");
Node node1 = _nodelist.item(0);
String _status1 = node1.getChildNodes().item(0).getNodeValue();
if(_status1.equalsIgnoreCase("OK"))
{
NodeList _nodelist_path = doc.getElementsByTagName("overview_polyline");
Node node_path = _nodelist_path.item(0);
Element _status_path = (Element)node_path;
NodeList _nodelist_destination_path = _status_path.getElementsByTagName("points");
Node _nodelist_dest = _nodelist_destination_path.item(0);
String _path = _nodelist_dest.getChildNodes().item(0).getNodeValue();
List<LatLng> directionPoint = decodePoly(_path);
PolylineOptions rectLine = new PolylineOptions().width(10).color(Color.RED).geodesic(true);
for (int i = 0; i < directionPoint.size(); i++)
{
rectLine.add(directionPoint.get(i));
}
gmap.addPolyline(rectLine);
mark_opt.position(new LatLng(dest_lat, dest_long));
mark_opt.draggable(true);
mark_opt.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
lokasi_tujuan = gmap.addMarker(mark_opt);
} else {
Toast.makeText(MapActivity.this, "Maaf, Tidak dapat menemukan rute tujuan\nCoba pilih rute lain yang mendekati", Toast.LENGTH_LONG).show();
}
progres_dlg.dismiss();
}
}
}
如何使第二个标记在折线路径上移动? 任何想法或帮助将不胜感激。 环境:Windows 7、Eclipse、Genymotion。
【问题讨论】:
-
您需要编写代码来计算
LatLngs 在路径上而不是在两点之间的直线上。 -
@MaciejGórski 你能给我一些样品吗? :)
-
@Marcin Orlowski 如果您能提供帮助,我将不胜感激,我已经尝试修复我的代码但没有找到正确的答案。
-
你已经被告知你需要做什么来实现你的目标,所以开始工作而不是等待。
-
@marcin 我已经编辑了我的帖子,我想问的是,我应该在我的 fetchData 方法上计算 LatLng 吗?
标签: android google-maps google-maps-markers google-maps-api-2