我想在 2 秒的间隔内从 google 地图上的 arrayList 添加标记
I want to add marker from arrayList on google map in the interval of 2 seconds
实际上我正在从 ArrayList
中获取 latitude
和 longitude
值,我想以 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();
}
}
我预计标记会在每 2-3 秒后添加到 google 地图上,但它不会在此间隔内添加。它显示了 google 地图上的所有经纬度标记。
您需要在创建时为您的标记设置动画--
private void animateMarker(final Marker marker) {
final Handler handler = new Handler();
final long startTime = SystemClock.uptimeMillis();
final long duration = 300; // ms
Projection proj = mMap.getProjection();
final LatLng markerLatLng = marker.getPosition();
Point startPoint = proj.toScreenLocation(markerLatLng);
startPoint.offset(0, -10);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final Interpolator interpolator = new BounceInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - startTime;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng = t * markerLatLng.longitude + (1 - t) * startLatLng.longitude;
double lat = t * markerLatLng.latitude + (1 - t) * startLatLng.latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
// Post again 16ms later (60fps)
handler.postDelayed(this, 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
);
实际上我正在从 ArrayList
中获取 latitude
和 longitude
值,我想以 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();
}
}
我预计标记会在每 2-3 秒后添加到 google 地图上,但它不会在此间隔内添加。它显示了 google 地图上的所有经纬度标记。
您需要在创建时为您的标记设置动画--
private void animateMarker(final Marker marker) {
final Handler handler = new Handler();
final long startTime = SystemClock.uptimeMillis();
final long duration = 300; // ms
Projection proj = mMap.getProjection();
final LatLng markerLatLng = marker.getPosition();
Point startPoint = proj.toScreenLocation(markerLatLng);
startPoint.offset(0, -10);
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final Interpolator interpolator = new BounceInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - startTime;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng = t * markerLatLng.longitude + (1 - t) * startLatLng.longitude;
double lat = t * markerLatLng.latitude + (1 - t) * startLatLng.latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
// Post again 16ms later (60fps)
handler.postDelayed(this, 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
);