2012-04-02 3 views
1

У меня есть цикл for, внутри которого я вызываю метод, показывающий poi на карте. Теперь я пытаюсь показать каждую последовательность в последовательности. Я имею в виду, что цикл for завершается на протяжение и, наконец, отображается с окончательным выходом.Дать задержку внутри цикла для цикла

Но я хочу, чтобы он был в порядке, что означает, что каждый раз, когда цикл повторяется, я должен видеть анимацию, в которой эти геоинформации движутся с места на место.

Вот мой код,

for (i=currentPOIindex;i<arraypoi.size();i++) { 
      poi = arraypoi.get(i); 
      latitude = poi.getLatitude().toString(); 
      longitude = poi.getLongitude().toString(); 
      placename = poi.getPlaceName().toString(); 
      mapdescription = poi.getPoiDecsription().toString(); 
      lat = Double.parseDouble(latitude); 
      lng = Double.parseDouble(longitude); 
      //use the poiIndex to identify which poi is highlighted 
      itemizedOverlay.poiIndex = i; 
      geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
      OverlayItem overlayitem = new OverlayItem(geopoint,fitTextToMapCallout(placename), fitTextToMapCalloutDescription("hello")); 
      itemizedOverlay.addOverlay(overlayitem); 
      mapOverlays.add(itemizedOverlay); 
      //this method is meant to move to each geopint one by one. 
      //And I am trying to give a delay before this method is called 
      moveToPOI(i); 
     } 


    public void moveToPOI(int currentPOI) { 
    try { 
     AudioMapOverLay overlay = (AudioMapOverLay) mapOverlays.get(currentPOI); 
     poi = arraypoi.get(currentPOI); 
     latitude = poi.getLatitude().toString(); 
     longitude = poi.getLongitude().toString(); 
     placename = poi.getPlaceName().toString(); 
     lat = Double.parseDouble(latitude); 
     lng = Double.parseDouble(longitude); 
     geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
     overlay.onForwardOrRewind(currentPOI, overlay); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Я попытался с помощью Thread.sleep (длинный мс); Но это не решение, может ли кто-нибудь сказать мне, что делать?

+0

Что случилось с Thread.sleep()? –

+0

Thread.sleep(), портит мой интерфейс, и только один раз геоинформация подсвечивается. – tejas

ответ

0

В заключение я придумал ответ. @Niko и @Herry, я не знаю, похоже ли это на ваш код.

вот мое изменение,

 notification = new Runnable() { 
      public void run() { 
       testgeo(); 
      } 
     }; 
     handler.postDelayed(notification, 1500); 

где testge0() является

private void testgeo() { 
    poi = arraypoi.get(index); 
    latitude = poi.getLatitude().toString(); 
    longitude = poi.getLongitude().toString(); 
    placename = poi.getPlaceName().toString(); 
    // mapdescription = poi.getPoiDecsription().toString(); 
    lat = Double.parseDouble(latitude); 
    lng = Double.parseDouble(longitude); 
    if (index == currentPOIindex) { 
     drawable = this.getResources().getDrawable(R.drawable.poiiconactive); 
     itemizedOverlay = new AudioMapOverLay(drawable, objMapView,this); 
    } else { 
     drawable = this.getResources().getDrawable(R.drawable.mapicon); 
     itemizedOverlay = new AudioMapOverLay(drawable, objMapView,this); 
    } 
    itemizedOverlay.poiIndex = index; 
    geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
    OverlayItem overlayitem = new OverlayItem(geopoint,fitTextToMapCallout(placename), 
      fitTextToMapCalloutDescription("hello")); 
    itemizedOverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedOverlay); 
    moveToPOI(index); 
} 

Но спасибо за вашу помощь. Это работает для меня

2

Вы должны делать некоторые вещи, как это в цикле For:

final Handler handler = new Handler(); 
    for (i=currentPOIindex;i<arraypoi.size();i++) { 
      poi = arraypoi.get(i); 
      latitude = poi.getLatitude().toString(); 
      longitude = poi.getLongitude().toString(); 
      placename = poi.getPlaceName().toString(); 
      mapdescription = poi.getPoiDecsription().toString(); 
      lat = Double.parseDouble(latitude); 
      lng = Double.parseDouble(longitude); 
     //use the poiIndex to identify which poi is highlighted 
      itemizedOverlay.poiIndex = i; 
      geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
      OverlayItem overlayitem = new OverlayItem(geopoint,fitTextToMapCallout(placename), fitTextToMapCalloutDescription("hello")); 
     itemizedOverlay.addOverlay(overlayitem); 
     mapOverlays.add(itemizedOverlay); 
     //this method is meant to move to each geopint one by one. 
     //And I am trying to give a delay before this method is called 
     handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
    //Do something after 100ms 
     moveToPOI(i); 

    } 
    }, 100/*This is Delay Value in Milli Second set which suit for your /*); 


    } 
+0

Спасибо, я попробую этот код. Любая точка с запятой (;) отсутствует здесь? – tejas

+0

oh Да из-за моего комментария после), мы должны добавить;. – Herry

+0

это также ведет себя так же, как мой предыдущий код. Я увеличил задержку до 1000, но все же он перемещается на растяжку. – tejas

1

Вы можете использовать обработчик postDelayed и Runnable, который делает фактическую работу, внутри Runnable запуска() удалить обратные вызовы для этого работоспособного и отправьте его снова обработчику. Если вы получаете некоторые обратные вызовы для завершенной операции, вы можете использовать это, чтобы снова запустить runnable.

Handler handler = new Handler() 
handler.postDelayed(myRunnable, MY_DELAY); 
Runnable myRunnable = new Runnable() { 
public void run() { 
//do the stuff 

// Check if another loop sequence is needed and start runnable again 
handler.removeCallbacks(myRunnable); 
handler.postDelayed(myRunnable, MY_DELAY); } 
+0

как я понял, должен ли я поставить для цикла цикла внутри run()? – tejas

+0

moveToPOI() следует вызывать в методе run. Сначала создайте элементы, а затем запустите runnable вне цикла. Вам также понадобится целое число элементов в runnable для передачи moveToPOI (index). – Niko

+0

public void animateTo (точка GeoPoint, java.lang.Runnable runnable). Я рекомендую использовать это, потому что исполняемый код, который вы передаете здесь, будет вызываться, когда анимация будет завершена, поэтому вы можете запустить новую анимацию. Вам не потребуется вызов postDelayed здесь. – Niko

Смежные вопросы