2012-08-15 12 views
5

Sto lavorando a un'applicazione (su un Galaxy Nexus), e ho notato che Google ha implementato il "Google Now" applicazione quando si scorrere dalla parte inferiore della cornice sullo schermo (il browser Chrome anche ha fatto questo per un po ', non so se lo fa ancora). Mi sono guardato intorno ma non sono stato in grado di determinare come hanno realizzato questo. C'è un modo semplice per gestire i gesti che iniziano nella cornice piuttosto che sullo schermo?lunetta Gesti con Android

Ho controllato le pagine di sviluppo per riferimento, ma l'unico articolo che ho trovato è stato qui:

http://developer.android.com/design/patterns/gestures.html

C'è qualsiasi altro luogo dove questa informazione sarebbe disponibile?

[Edit]

Ho cercato, senza successo, di ottenere molto gesti bordo di lavoro basati sul metodo di Lain_B, ma non riesco a farlo funzionare. Ecco il codice che sto usando per cercare di rilevare i gesti, ma logcat è sempre emettendo uno zero ...

public class MainActivity extends Activity implements OnGestureListener { 

private GestureDetector myGesture; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    myGesture = new GestureDetector(getBaseContext(), 
      (OnGestureListener) this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Log.e("Flags Touch", "Flags: " + event.getEdgeFlags()); 
    return myGesture.onTouchEvent(event); 
} 

@Override 
public boolean onDown(MotionEvent e) { 
    Log.e("Flags", "Flags: " + e.getEdgeFlags()); 
    Log.e("Event", "onDown"); 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void onLongPress(MotionEvent e) { 
    Log.e("Event", "onLongPress"); 
    // TODO Auto-generated method stub 

} 

@Override 
public void onShowPress(MotionEvent e) { 
    Log.e("Flags", "Flags: " + e.getEdgeFlags()); 
    Log.e("Event", "onShowPress"); 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean onSingleTapUp(MotionEvent e) { 
    Log.e("Event", "onSingleTapUp"); 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 
    // Log.e("Event", "onScroll"); 
    return false; 
} 

// these constants are used for onFling 
private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 

    Log.e("Event", "onFling"); 
    Log.e("Flags", "Flags: " + e1.getEdgeFlags()); 

    if (e1.getEdgeFlags() == MotionEvent.EDGE_LEFT) { 
     // code to handle swipe from left edge 
     Log.e("!!!!!", "Edge fling!"); 
    } 

    try { 
     // do not do anything if the swipe does not reach a certain length 
     // of distance 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
      return false; 

     // right to left swipe 
     if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) { 

     } 
     // left to right swipe 
     else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) { 

     } 
    } catch (Exception e) { 
     // nothing 
    } 
    return false; 

} 
} 

[Edit 2]

Con uscita richiesto di Lain_B ...

(Utilizzando Nexus 7) ... a partire da più lontano punto di sinistra possibile sulla lunetta, e scorrendo a destra verso il centro (ish).

08-16 16:44:13.674: I/Fling(16702): Flags: 0 
08-16 16:44:13.674: I/Fling(16702): e1: 2.5 711.5152 
08-16 16:44:13.674: I/Fling(16702): e2: 215.4591 717.08105 

Swiping dal punto centrale dello schermo, fuori dallo schermo (a destra)

08-16 16:46:37.364: I/Fling(16702): Flags: 0 
08-16 16:46:37.364: I/Fling(16702): e1: 392.5 758.1818 
08-16 16:46:37.364: I/Fling(16702): e2: 783.4375 743.3334 
+0

Non sono sicuro, ma stai cercando questo? http://developer.android.com/reference/android/view/GestureDetector.html –

+0

Sto già utilizzando un ascoltatore gesto, stavo solo cercando di determinare come implementarlo quando si avvia al di fuori dei confini dello schermo. – RyanInBinary

risposta

8

penso MotionEvent.getEdgeFlags() è quello che stai cercando. È quindi possibile confrontare il valore restituito con EDGE_LEFT, EDGE_RIGHT, ecc per vedere quale bordo è stato toccato.

if(event1.getEdgeFlags()&MotionEvent.EDGE_LEFT != 0){ 
    //code to handle swipe from left edge 
} 

o

if(e1.getX() < 5.0f){ 
    //handle swipe from left edge 
} 
+0

Inchiodato. Grazie Lain! Sei stato migliorare il mio codice di molto gli ultimi giorni – RyanInBinary

+0

Felice di aiutare, le domande sono state in aree che ho fatto un bel po 'di lavoro in. –

+1

Ok, quindi questo non funziona ancora per me, l'ho aggiunto al mio evento onFling, e restituisce sempre un 0x0 per i flag di bordo (niente toccato). Mi sto perdendo qualcosa? L'interfaccia utente di sistema di Jellybean sovrascrive qualsiasi tentativo di utilizzo di questi perché sta ascoltando il "Google Now" scorrere verso l'alto dalla parte inferiore della cornice? Sto cercando di lavorare in una funzionalità simile, ma dai bordi sinistro/destro – RyanInBinary

7

Basandosi su MotionEvent.getEdgeFlags è sbagliato. Vedere questo dibattito per maggiori informazioni: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ZNjpzbkxeNM

Concettualmente per rilevare un colpo vantaggio necessario per rilevare un evento di trascinamento/scroll e anche assicurarsi l'originale "x" coordinata della manifestazione verso il basso è a una certa distanza dal bordo.

Il modo più semplice per farlo è quello di utilizzare un GestureDetector per rilevare drag/scorrimento. Fortunatamente il metodo onScroll di SimpleOnGestureListener ha tutto ciò di cui hai bisogno.

Quindi qualcosa di simile (se si utilizza un GestureDetector configurato con SimpleOnGestureListener):

public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 

     if (e1.getX() < SOME_DISTANCE_FROM_SCREEN) { 
      //your code 
      return true; 
     } 
     return false; 
} 
+0

Questo è molto più semplice e ha funzionato perfettamente per me – Mike

+1

Che cosa significa una certa distanza dallo schermo? Qual è il suo scopo? Non sto capendo il codice sopra. – ilikeyoyo

+0

@Raster è una costante che si definisce per contrassegnare la massima distanza di accettazione dal bordo di uno schermo in cui un evento tattile viene considerato uno sfioramento. – ataulm

Problemi correlati