2012-04-12 13 views
5

Sto provando a usare uno scroller per lanciarlo in una posizione fissa. Il mio problema è: finisce nella posizione corretta, ma è solo in esecuzione una volta e impostando la posizione finale immediatamente o scorre molto lentamente prima e poi salta alla fine.Android Scroller si lancia in posizione fissa

EDIT: il problema sembra essere che a) la mia velocità è a volte zero (questo è un problema da qualche altra parte :)) e che devo estendere la durata usando scroller.extendDuration(). Tuttavia non sono sicuro di quale dovrebbe essere la durata. Non riesco a trovare informazioni su ciò che una determinata velocità in realtà significa. È pixel al secondo?

Ecco il mio codice:

private class Flinger implements Runnable { 

    private final Scroller scroller; 

    private int lastX = 0; 

    public Flinger() { 
     scroller = new Scroller(getContext()); 
    } 

    void startFling(int initialVelocity, int offsetX) { 
     Log.d("test", "finalX = " + offsetX); 
     if (offsetX > 0) { 
      scroller.fling(0, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0); 
      scroller.setFinalX(offsetX); 
      lastX = 0; 
     } else { 
      scroller.fling(getWidth(), 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0); 
      scroller.setFinalX(getWidth() + offsetX); 
      lastX = getWidth(); 
     } 
     post(this); 
    } 

    @Override 
    public void run() { 
     if (scroller.isFinished()) { 
      Log.d("test", "scroller finished"); 
      return; 
     } 

     boolean more = scroller.computeScrollOffset(); 
     int x = scroller.getCurrX(); 
     int diff = lastX - x; 
     Log.d("test", "isFlinging, x=" + x + ", diff=" + diff + ", leftOffset=" + getLeftOffset() + ", isDone=" + !more); 
     if (diff != 0) { 
      setLeftOffset(getLeftOffset() - diff); 
      lastX = x; 
     } 

     if (more) { 
      post(this); 
     } 
    } 
} 
+0

Come si sta calcolando la velocità, e anche state facendo questa funzionalità di scorrimento su interazione con l'utente, come il tocco spostare – Triode

+0

Come si sta calcolando la velocità, e anche state facendo questa funzionalità di scorrimento su interazione con l'utente, come il tocco mossa se questo è il caso, allora perché non puoi usare una cosa come questa finale int delta = newX - getScrollX(); mScroller.startScroll (getScrollX(), 0, delta, 0, Math.abs (delta)); newX è la posizione corrente del mouse su. Inoltre, puoi utilizzare Velocity Tracker per controllare la velocità di spostamento del tocco. – Triode

+0

Sì, sto usando un VelocityTracker, ma ho capito quale fosse il problema (vedi risposta sotto). Grazie! –

risposta

2

Ok ho capito. In effetti ho dovuto estendere la durata (tuttavia la documentazione è un po 'fuorviante - non è il valore aggiunto alla durata calcolata corrente, è la nuova durata effettiva).

Dopo aver letto un po 'più di documentazione ho capito che la velocità necessaria è in effetti pixel per secondo e in realtà ho definito il VelocityTracker per utilizzare questa unità.

Quindi questa è la linea mancante:

scroller.extendDuration ((int) (Math.abs (offsetX)/(float) Math.max (1000, Math.abs (initialVelocity)) * 1000));

Problemi correlati