Я хочу добавить маркер из arrayList на карте Google в интервале 2 секунды - PullRequest
0 голосов
/ 12 июня 2019

На самом деле я получаю значения latitude и longitude от 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();

    }
}

Я ожидал, что через каждые 2-3 секунды маркеры будут добавляться на карту Google, но это не добавляет в этом интервале.Он показывает все последние отметки на карте Google.

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Вы можете легко добиться этого, используя RxJava

  Observable.from(listOfItems)
                .zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, notUsed) -> item)
                .subscribe(
                 // add marker addition logic here 
                        );
0 голосов
/ 12 июня 2019

у вас есть цикл for в displayCurrentLocation, который отображает все при каждом запуске 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));
    }
}
0 голосов
/ 12 июня 2019

Вам нужно анимировать маркер при создании -

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);
            }
        }
    });
}
...