2012-03-16 11 views
12

Sto lavorando su un'app che conta il numero di punti interrogativi in ​​alcuni paragrafi di testo.Come creare un effetto di conteggio per un testoView in Android

Al termine della scansione (che non richiede affatto tempo) mi piacerebbe avere il totale presentato dopo che il numero va da 0 a TOTAL. Quindi, per 10: 0,1,2,3,4,5,6,7,8,9 e quindi STOP.

Ho provato un paio di tecniche diverse:

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

Inoltre ho provato questo:

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

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

sono sicuro che questi sono entrambi i tentativi del tutto amatoriale. Qualsiasi aiuto sarebbe molto apprezzato.

Grazie,

Richard

+2

Se stai utilizzando il metodo di sospensione sul thread dell'interfaccia utente, quindi non utilizzare il thread principale della tua app. Bloccherà l'interfaccia e l'utente non sarà in grado di fare nulla in quel momento. – AndreiBogdan

+0

Questo è esattamente quello che è successo. Qualche idea su come posso ottenere l'effetto che sto cercando? –

+0

È molto tardi e sono stanco quindi non posso seguire esattamente ciò che vuoi fare ma per evitare l'interruzione del collegamento, devi impostare il metodo di sospensione in un thread separato.O crearne uno e mettervi il metodo sleep, o non sono sicuro di averlo usato molto tempo fa, c'è un qualche tipo di timer da Java o dalla piattaforma Android che crea automaticamente un thread separato e potete allegare un callback funzione in modo che venga eseguita ogni 500 millisecondi. Solo google java timer o timer Android o semplicemente aspettare qualcuno qui per dirti: P haha. Sono 2 stanco in questo momento :) – AndreiBogdan

risposta

10

Prova questo:

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

Grazie mille per aver trovato il tempo per scriverlo. In questo momento ho un metodo che ottiene i messaggi di testo e conta i messaggi chiamati: 'protected void onActivityResult (int requestCode, int resultCode, Intent data) {' voglio iniziare il thread dopo questo? O al suo interno? Non riesco a farlo funzionare se avvio il thread eseguibile all'interno di quel metodo. –

+1

@burtonic Non dovrebbe esserci un problema nell'iniziare il thread da quel metodo di callback, quando si ottiene il numero totale quindi si avvia il thread. ('OnActivityResult' è un metodo di callback, chiamato quando ci si aspetta qualcosa da un'attività secondaria che è stata avviata con startActivityForResult()). Si noti che 'TextView' dovrebbe essere' final' in modo da potervi accedere da quella classe anonima. – Luksprog

+1

Un po 'di re-jigging e funziona esattamente come volevo. Grazie! http://cl.ly/0X0H0M1Y3Y3L1j3g1C2d –

0

Forse provare a cambiare il ciclo for a qualcosa di simile:

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

Sfortunatamente questo semplicemente spinge il totale corretto alla vista immediatamente. Ho dovuto cambiare sentScore per l'invio. Questo è il nome della variabile che contiene il totale. –

+0

utilizzando un thread separato e dormire è meglio, come slukian ha appena pubblicato. – Magicode

1

Utilizzare un thread di lavoro per fare l'attesa e aggiorna il thread dell'interfaccia utente.

È possibile utilizzare un AsyncTask, anche se potrebbe essere eccessivo per questo lavoro. Se lo si utilizza, nel ciclo doInBackground() sul numero di periodi di sospensione e dopo ogni periodo di sospensione, aggiornare il conteggio nel UIthread.

Ecco qua! Slukain appena ti ha dato il codice di lavoro: P

2

Usa TextSitcher

per i migliori effetti. Trasformerà il testo dolcemente.

In caso di modifica del testo, utilizzare il codice riportato di seguito.

> 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

Credo che tu intendessi "TextSwitcher''' giusto? Avresti dovuto pubblicare un frammento di codice più completo che mostra l'uso di esso. Ma ancora, punti per menzionare quella dolce classe dolce :) – acrespo

46

ho usato un'animazione Android in stile più convenzionale per questo:

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

Si può giocare con i valori 0 e count per rendere il contatore andare da un qualsiasi numero a qualsiasi numero, e giocare con lo 1000 per impostare la durata dell'intera animazione.

Si noti che questo supporta l'API Android di livello 11 e superiore, ma è possibile utilizzare il fantastico progetto nineoldandroids per renderlo facilmente compatibile con le versioni precedenti.

+4

Elegante e sexy :) – User3

+1

Se startValue è diverso da 0, non funziona correttamente. È necessario aggiornare la funzione di valutazione per restituire la frazione startValue + (endValue - startValue) *. A parte questo grande lavoro! –

+0

grazie, ho aggiornato il codice – marmor

Problemi correlati