2010-12-28 1 views

risposta

11

Se il problema è in 2D, è abbastanza semplice

  1. È necessario per ottenere il tempo trascorso in ogni fotogramma
  2. tuo onTouch la funzione troverà l'accelerazione del dito. Ho dimenticato la formula su come ottenere l'accelerazione a distanza. Dovrebbe essere la seconda derivata della posizione con una variabile temporale. Ma dovresti sempre convertire il tuo deltaX, deltaY in accelerazione. Per semplificare non hai davvero bisogno di mettere qualcosa di preciso lì. Edit: non so perché non l'ho visto, ma la funzione era tutto lì ...

    acceleration.x = 2 (newposition.x - position.x - speed.x * elapsedTime)/(trascorso * tempo trascorso);

  3. Una volta ottenuta l'accelerazione, è possibile impostare la nuova posizione con quel codice. Questa è una dinamica fisica semplice in 2d. Con la tua accelerazione puoi trovare la tua velocità e con la tua velocità puoi trovare la tua prossima posizione.

    speed.x = (float) (mass * acceleration.x * elapsed + speed.x); 
    speed.y = (float) (mass * acceleration.y * elapsed + speed.y); 
    
    
    position.x += mass * acceleration.x/2 * elapsed * elapsed + speed.x * elapsed; 
    position.y += mass * acceleration.y/2 * elapsed * elapsed + speed.y * elapsed; 
    
    
    speed.x *= friction; 
    speed.y *= friction; 
    

Messa e l'attrito vi permetterà di definire quanto veloce va e quanto velocemente si rallenta da sola. Probabilmente dovrai modificare il codice perché questa dinamica non è esattamente bella se devi dover scorrere all'indietro per rallentare.

Alla fine di ciascun fotogramma, è necessario ripristinare l'accelerazione su (0,0). E su ogni nuovo fotogramma dopo un tocco uniforme, l'accelerazione dovrebbe essere impostata su qualcosa. Dovrebbe funzionare molto bene :)

+1

Stavo guardando la tua risposta e mi sto chiedendo come ottenere velocità per l'uso in accelerazione quando la tua formula di velocità richiede accelerazione ... Uno dipende e richiede l'altro? – Dan

+0

Invece di calcolare direttamente la velocità, può dare risultati migliori per l'utilizzo dell'accelerazione. La velocità iniziale e l'accelerazione sono pari a 0. Quindi devi risparmiare velocità da qualche parte per aggiungerlo al seguente frame. L'accelerazione non è altro che il cambiamento tra ogni fotogramma. L'accelerazione potrebbe essere il deltaX, deltaY. La velocità effettiva sarà quella deltaX * scadutaTime + lastSpeed. In questo modo, la velocità viene calcolata correttamente anche se un fotogramma richiede molto tempo o una piccola quantità di tempo. Altri parametri fingono un po 'di fisica per aggiungere inerty e attrito. Non vuoi davvero che scorra per sempre. –

1
  1. Misurare la velocità di scorrimento della vista.
  2. Rileva quando l'utente interrompe lo scorrimento.
  3. Ridurre gradualmente la velocità a cui scorre la vista a scorrimento.

Qualcosa di simile a questo:

public void redraw() { 
    myScrollView.ySpeed = myScrollView.lastY-myScrollView.y; 
    myScrollView.xSpeed = myScrollView.lastX-myScrollView.x; 
    if (!userIsScrolling && ySpeed > 0) { 
     ySpeed--; 
    } 
    if (!userIsScrolling && xSpeed > 0) { 
     xSpeed--; 
    } 
    myScrollView.lastY = myScrollView.y; 
    myScrollView.y += ySpeed; 
    myScrollView.lastX = myScrollView.x; 
    myScrollView.x += xSpeed; 
} 

public void userStoppedScrolling() { 
    userIsScrolling = false; 
} 
+0

grazie, sai esattamente come posso controllare la velocità con cui l'utente sta scorrendo? In questo momento calcola semplicemente il delta tra la posizione iniziale e la posizione finale del dito dell'utente e poi lo inserisce nella matrice. – jfisk

+0

Spiacente, non conosco abbastanza bene Android per aiutare con dettagli come la posizione del tocco e così via. – Jumhyn