2011-11-06 9 views
6

Sto provando a rilevare un movimento verso l'alto sul mio dispositivo Android, ma sto trovandolo abbastanza difficile. Ho scritto il seguente codice, e funziona per tutto il movimento improvviso (cioè accelerazione veloce) su tutte le direzioni. Tuttavia, mi piacerebbe che funzioni solo per un improvviso movimento verso l'alto. Qualsiasi aiuto è molto apprezzato.Rilevamento improvviso movimento verso l'alto in Android

public void onSensorChanged(SensorEvent event) { 
      // alpha is calculated as t/(t + dT) 
      // with t, the low-pass filter's time-constant 
      // and dT, the event delivery rate 

      final float alpha = 0.8f; 

      gravity = new float[3]; 
      linear_acceleration = new float[3]; 
      linear_acceleration_old = new float[3]; 

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

      linear_acceleration[0] = event.values[0] - gravity[0]; 
      linear_acceleration[1] = event.values[1] - gravity[1]; 
      linear_acceleration[2] = event.values[2] - gravity[2]; 

      System.out.println(linear_acceleration[0] + " " 
        + linear_acceleration[1]+" " +linear_acceleration[2]); 

      //detects swift movements, but I want to detect only upward ones 
      if((Math.abs(linear_acceleration[1] - linear_acceleration_old[1]) > 10.0f 
        && Math.abs(linear_acceleration[2] - linear_acceleration_old[2]) > 5.0f) 
        || isFirstEvent) { 
       if(!isFirstEvent) 
        //do something 

       linear_acceleration_old[0] = linear_acceleration[0]; 
       linear_acceleration_old[1] = linear_acceleration[1]; 
       linear_acceleration_old[2] = linear_acceleration[2]; 
       isFirstEvent= false; 
      } 
     } 
+0

Non capisco davvero cosa si sta facendo, ma dal momento che si inizializza linear_acceleration_old nella parte superiore del metodo è pieno di valori zero quando lo si fa ((Math.abs (linear_acceleration [1] - linear_acceleration_old [1 ])> 10.0f ecc. Potresti inserire l'inizializzazione nel costruttore della classe.Alcuni punti per la gravità, infatti non so se questo da solo farà funzionare il tuo codice però! –

+0

grazie james. Non sono del tutto sicuro di quello che sto donando.La mia idea era di rilevare una differenza nell'accelerazione vecchia e attuale, e se questo delta è sufficientemente grande, quindi innescare un evento, tuttavia, non sono del tutto sicuro .. – OckhamsRazor

risposta

3

Io non sono molto sicuro di cosa si intende per "verso l'alto", però:

  1. lasciando che il resto del telefono sulla superficie del tavolo e sollevarla (renderlo più alta della tabella) , sarebbe un cambiamento nell'asse Z.

  2. in verticale tenendo il telefono come se si stesse parlando e quindi tirarlo su (alzarlo più in alto), sarebbe un cambiamento nell'asse Y.

Se si desidera rilevare questi movimenti, è necessario modificare il codice per calcolare i delta solo nell'asse corrispondente.

+0

grazie. il mio codice lo fa, calcola i delta solo su linear_acceleration [1] (asse y) e linear_acceleration [2] (asse z). – OckhamsRazor

+0

Mi sembra che tu intendessi "&& isFirstEvent" i nstead di "||", quindi si innesca solo una volta. Non vedo il valore iniziale di quel booleano, ma presumo che tu l'abbia reso "vero" da qualche parte? – user1032613

0

Non si deve operare solo su x, y, z sensori accelerometrici ma tener conto dei sensori di orientamento troppo: SensorManager.getOrientation

questo modo è possibile garantire la direzione "alto".

Problemi correlati