Java 我想从谷歌地图上的arrayList中每隔2秒添加一个标记
实际上,我正在从Java 我想从谷歌地图上的arrayList中每隔2秒添加一个标记,java,android,google-maps,android-asynctask,handler,Java,Android,Google Maps,Android Asynctask,Handler,实际上,我正在从ArrayList获取纬度和经度值,我想在地图上以3秒的间隔显示这些位置 我已经创建了一个名为waitSec()的方法,我正在displayLocation()中调用它,但这不起作用,因为它阻止了主线程,所以我使用了handler和asynctask,我发现了这方面的困难 public void waitSec(){ long start = System.currentTimeMillis(); while(System.currentTimeMillis()&
ArrayList
获取纬度
和经度
值,我想在地图上以3秒的间隔显示这些位置
我已经创建了一个名为waitSec()
的方法,我正在displayLocation()
中调用它,但这不起作用,因为它阻止了主线程,所以我使用了handler
和asynctask
,我发现了这方面的困难
public void waitSec(){
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+3000);
}
class MyAsyncTask extends AsyncTask<Integer,Integer,Void>{
@Override
protected Void doInBackground(Integer... integers) {
waitSec();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Log.e("TAG", "onPostExecute: we have waited 3 seconds" );
displayCurrentLocation();
}
}
private void displayCurrentLocation() {
for(int i=0;i<trackObjectList.size();i++){
//Log.e("TAG", "displayCurrentLocation: "+trackObjectList.get(i).getLatitude() );
if(trackObjectList.size()>0)
latLng = new LatLng(Double.parseDouble(trackObjectList.get(i).getLatitude())
,Double.parseDouble(trackObjectList.get(i).getLongitude()));
mMap.addMarker(new MarkerOptions().position(latLng)
.title("Here")
.icon(BitmapDescriptorFactory.fromBitmap(getSmallerSize(R.drawable.green_dot_th))));
mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,15f));
//waitSec();
}
}
public void waitSec(){
长启动=System.currentTimeMillis();
while(System.currentTimeMillis()创建标记时需要设置标记的动画--
private void animateMarker(最终标记){
最终处理程序=新处理程序();
最终长启动时间=SystemClock.uptimeMillis();
最终长持续时间=300;//毫秒
Projection proj=mMap.getProjection();
最终车床标记LatLng=marker.getPosition();
点开始点=项目至筛选位置(标记标记);
起始点偏移量(0,-10);
最终LatLng StartAtlng=屏幕位置(起始点)的项目;
最终插值器插值器=新的反弹插值器();
handler.post(新的Runnable(){
@凌驾
公开募捐{
长时间运行=SystemClock.uptimeMillis()-startTime;
float t=interpolator.getInterpolation((float)经过时间/持续时间);
双液化天然气=t*标记经度+(1-t)*标记经度;
双纬度=t*标记纬度+(1-t)*标记纬度;
标记器设置位置(新板条(板条,板条));
如果(t<1.0){
//16毫秒后再次发布(60帧/秒)
handler.postDelayed(这是16);
}
}
});
}
displayCurrentLocation中有一个for循环,每次asyncTask.onPostExecute()运行时都会显示所有内容
请尝试以下操作:
private int objectsSize = trackObjectList.size()-1;//initialise this somewhere appropriate
private void displayCurrentLocation()
{
int i=objectsSize--;
//Log.e("TAG", "displayCurrentLocation: "+trackObjectList.get(i).getLatitude() );
if(i>=0)
{
latLng = new LatLng(Double.parseDouble(trackObjectList.get(i).getLatitude())
,Double.parseDouble(trackObjectList.get(i).getLongitude()));
mMap.addMarker(new MarkerOptions().position(latLng)
.title("Here")
.icon(BitmapDescriptorFactory.fromBitmap(getSmallerSize(R.drawable.green_dot_th))));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,15f));
}
}
您可以使用RxJava轻松实现这一点
Observable.from(listOfItems)
.zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, notUsed) -> item)
.subscribe(
// add marker addition logic here
);
这是我第一次在这里发帖,如果我犯了任何错误,我很抱歉。我认为你需要在创建标记时使用动画。你可以简单地使用带有postDelayed方法的处理程序。不需要在asyntaski中使用任何复杂的代码。我使用一个没有任何动画的简单标记,但我希望我的标记在每次se后都显示在google地图上条件,这样它会自动创建一个标记路径。那么我正在检索latlang值的arraylist呢?
Observable.from(listOfItems)
.zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, notUsed) -> item)
.subscribe(
// add marker addition logic here
);