0
votes

Je veux ajouter un marqueur de arrayList sur google map dans l'intervalle de 2 secondes

En fait, j'obtiens les valeurs latitude et longitude de la ArrayList , et je souhaite afficher ces emplacements sur la carte dans l'intervalle de 3 secondes.

J'ai créé une méthode nommée waitSec () et je l'appelle dans displayLocation () mais cela ne fonctionne pas car cela a bloqué le thread principal alors j'ai utilisé handler et asynctask et j'ai trouvé des difficultés à ce sujet.

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();

    }
}

Je m'attendais à ce qu'après 2-3 secondes les marqueurs ajoutera sur google map mais il n'ajoute pas dans cet intervalle. Il montre toutes les marques latlng sur google map.


5 commentaires

c'est la première fois que je poste une question ici, désolé si j'ai fait une erreur.


je pense que vous devez utiliser l'animation au moment de la création du marqueur


Vous pouvez simplement utiliser Handler avec la méthode postDelayed .


pas besoin d'utiliser n'importe quel type de code complexe dans asynctask


J'utilise un simple marqueur sans aucune animation, mais je veux que mon marqueur s'affiche sur google map toutes les secondes afin qu'il crée automatiquement un chemin de marqueur.


3 Réponses :


0
votes

Vous devez animer votre marqueur lors de la création -

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


1 commentaires

et qu'en est-il de arraylist que je récupère des valeurs lat longues?



0
votes

vous avez une boucle for dans displayCurrentLocation qui affiche tout à chaque exécution de asyncTask.onPostExecute ().

essayez ce qui suit:

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 commentaires

1
votes

Vous pouvez facilement y parvenir en utilisant RxJava

  Observable.from(listOfItems)
                .zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, notUsed) -> item)
                .subscribe(
                 // add marker addition logic here 
                        );


0 commentaires