我正在探索谷歌地图Android Api v2 ,我发现了一些我正在搞乱的麻烦!
我正在使用包含来自XML文件的路由的LatLng数组。
我希望应用使用导入的数据模拟车辆乘坐。 (显示一个简单的标记,显示循环中数组中包含的'当前'位置)
我找到了一种方法,将标记从一个点激活到另一个点。当我使用两个坐标时它工作得很好,但是当我使用整个数组时它会变得很疯狂!
我想这是因为animateMarker方法中的处理程序。
所以,我的问题是,如何使主线程等待animateMarker完成,以便正确查看模拟路线。
谢谢。
以下是代码:
public class MainActivity extends Activity {
GoogleMap mMap;
ArrayList<LatLng> coordinates;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* Here I import the LatLng array from an XML file
*/
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
Marker myMarker;
myMarker = mMap.addMarker(new MarkerOptions()
.position(coordinates.get(0)));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates.get(0),17));
for(int i=0;i<coordinates.size()-1;i++){
animateMarker(myMarker, coordinates.get(i+1), false);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates.get(i),17));
}
}
/**
*
* @param marker
* @param toPosition
* @param hideMarker
* @return
*/
public void animateMarker(final Marker marker, final LatLng toPosition,
final boolean hideMarker) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
final LatLng startLatLng= marker.getPosition();
final long duration = 2000;
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);
}
}
}
});
}
}
答案 0 :(得分:0)
使用AsyncTask
这是一个例子
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
创建后,任务执行非常简单:
new DownloadFilesTask().execute(url1, url2, url3);