2012-03-16 13 views
12

Pracuję nad aplikacją, która zlicza liczbę znaków zapytania w kilku akapitach tekstu.Jak utworzyć efekt zliczania dla textView w Androidzie

Po zakończeniu skanowania (które nie zajmuje wcale czasu) chciałbym mieć sumę prezentowaną po liczbie od 0 do TOTAL. Tak więc, dla 10: 0,1,2,3,4,5,6,7,8,9 , a następnie STOP.

Próbowałem kilka różnych technik:

   TextView sentScore = (TextView) findViewById(R.id.sentScore); 

       long freezeTime = SystemClock.uptimeMillis(); 

       for (int i = 0; i < sent; i++) { 
        if ((SystemClock.uptimeMillis() - freezeTime) > 500) { 
         sentScore.setText(sent.toString()); 
        } 
       } 

Również próbowałem to:

for (int i = 0; i < sent; i++) { 
     // try { 
      Thread.sleep(500); 

     } catch (InterruptedException ie) { 
      sentScore.setText(i.toString()); 
     } 
    } 

jestem pewien są oba całkowicie amatorskie próby. Każda pomoc byłaby mile widziana.

Dzięki

Richard

+2

Jeśli używasz metody uśpienia w wątku interfejsu użytkownika, a więc głównego wątku aplikacji, nie rób tego. Będzie blokować interfejs, a użytkownik nie będzie mógł nic zrobić w tym czasie. – AndreiBogdan

+0

Tak właśnie się stało. Masz pomysł na to, w jaki sposób mogę osiągnąć efekt, którego szukam? –

+0

Jest bardzo późno i jestem zmęczony, więc nie mogę dokładnie spełnić tego, co chcesz zrobić, ale aby uniknąć interfejsu od zera, musisz ustawić metodę uśpienia w osobnym wątku.Albo stwórz jedną i umieść tam metodę uśpienia, albo nie jestem pewien, jak ją używałem dawno temu, jest jakiś typ timera albo z Javy albo z platformy Android, która automatycznie tworzy osobny wątek i możesz dołączyć wywołanie zwrotne działa tak, że wykonuje to co każde 500 milisekund. Po prostu liczniki google java lub zegary android lub po prostu czekać na kogoś tutaj, aby powiedzieć: P haha. Jestem 2 zmęczony już teraz :) – AndreiBogdan

Odpowiedz

10

Spróbuj tego:

private int counter = 0; 
private int total = 30; // the total number 
//... 
//when you want to start the counting start the thread bellow. 
    new Thread(new Runnable() { 

       public void run() { 
        while (counter < total) { 
         try { 
          Thread.sleep(500); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         t.post(new Runnable() { 

          public void run() { 
           t.setText("" + counter); 

          } 

         }); 
         counter++; 
        } 

       } 

      }).start(); 
+0

Dziękuję bardzo za poświęcenie czasu na napisanie tego. W tej chwili mam metodę, która pobiera wiadomości tekstowe i zlicza komunikaty o nazwie: 'protected void onActivityResult (int requestCode, int resultCode, Intent data) {czy chcę zainicjować wątek po tym? A może w tym? Nie mogę sprawić, żeby działało, jeśli uruchomię wątek z tej metody. –

+1

@burtonic Nie powinno być problemu z uruchomieniem wątku z tej metody wywołania zwrotnego, kiedy otrzymasz całkowitą liczbę, a następnie uruchom wątek. ('OnActivityResult' to metoda wywołania zwrotnego, wywoływana, gdy oczekujesz czegoś z czynności podrzędnej, którą uruchomiłeś z funkcją startActivityForResult()). Zauważ, że 'TextView' powinien być' ostateczny', abyś mógł uzyskać do niego dostęp z tej anonimowej klasy. – Luksprog

+1

Trochę ponownego jigowania i działa dokładnie tak, jak tego chciałem. Dziękuję Ci! http://cl.ly/0X0H0M1Y3Y3L1j3g1C2d –

0

Może spróbuj zmienić dla pętli do czegoś podobnego:

int count = 0; 
while (count != sent) { 
    if ((SystemClock.uptimeMillis() - freezeTime) > 500) { 
     count++; 
     sentScore.setText("" + count); 
     freezeTime = SystemClock.uptimeMillis(); 
    } 
} 
+0

Niestety, po prostu od razu przesyła prawidłową wartość do widoku. Musiałem zmienić sentScore na wysłany. Tak nazywa się zmienna, która zawiera sumę. –

+0

używanie osobnego wątku i spanie jest lepsze, jak opublikował slukian. – Magicode

1

Użyj wątku roboczego zrobić oczekujące i zaktualizuj swój wątek UI.

Można użyć AsyncTask, ale może to być przesada dla tego zadania. Jeśli używasz tego, w pętli doInBackground() przez liczbę okresów snu i po każdym okresie snu, zaktualizuj liczbę w UIthread.

Idź! Slukain prostu dał Ci kod pracy: P

2

Zastosowanie TextSitcher

za najlepsze efekty. Przetworzy tekst delikatnie.

Podczas przechodzenia do zmiany tekstu użyj poniższego kodu.

> int number = 0; 
>   Timer obj = new Timer(); 
>   TimerTask tt = new TimerTask() { 
>      @Override   public void run() { 
>    // TODO Auto-generated method stub 
>    textView.setText(number++); 
>    if(number < score) 
>    obj.schedule(tt, 200);   }  }; 
>   obj.schedule(tt, 200); 
+0

Wierzę, że miałeś na myśli '' 'TextSwitcher''', prawda? Powinieneś opublikować bardziej kompletny fragment kodu pokazujący jego użycie. Ale wciąż, wskazuje na tę słodką słodką klasę :) – acrespo

46

Użyłem bardziej konwencjonalny animacji Android w stylu tego:

 ValueAnimator animator = new ValueAnimator(); 
     animator.setObjectValues(0, count); 
     animator.addUpdateListener(new AnimatorUpdateListener() { 
      public void onAnimationUpdate(ValueAnimator animation) { 
       view.setText(String.valueOf(animation.getAnimatedValue())); 
      } 
     }); 
     animator.setEvaluator(new TypeEvaluator<Integer>() { 
      public Integer evaluate(float fraction, Integer startValue, Integer endValue) { 
       return Math.round(startValue + (endValue - startValue) * fraction); 
      } 
     }); 
     animator.setDuration(1000); 
     animator.start(); 

Można grać z wartościami 0 i count aby licznik przejść z dowolnej liczby do dowolnej liczby, a graj z 1000, aby ustawić czas trwania całej animacji.

Należy pamiętać, że obsługuje to interfejs API systemu Android na poziomie 11 i nowszym, ale można użyć niesamowitego projektu nineoldandroids, aby z łatwością dostosować go do poprzednich wersji.

+4

Elegancki i seksowny :) – User3

+1

Jeśli parametr startValue jest inny niż 0, nie działa poprawnie. Musisz zaktualizować funkcję assess, aby zwrócić frakcję startValue + (endValue - startValue) *. Poza tą wspaniałą pracą! –

+0

dziękuję, zaktualizowałem kod – marmor

Powiązane problemy