Autore Topic: [facile] Catturare le gesture di swipe/fling  (Letto 8673 volte)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
[facile] Catturare le gesture di swipe/fling
« il: 27 Agosto 2010, 14:36:13 CEST »
+4
Livello di difficoltà: facile
Versione SDK utilizzata: 1.6
Link al file compresso del progetto eclipse: file in allegato

Questo tutorial illustra come catturare le gesture di swipe o fling (il movimento che si esegue per spostarsi da una schermata all'altra nella Home di Android).


Questo tutorial è un adattamento/semplificazione di quello realizzato da Code Shogun (sono state rimosse le animazioni, il progetto è stato portato su 1.6 ed è stato ottimizzato anche per densità differenti da mdpi).

Sorgenti:
Codice (Java): [Seleziona]
public class MainActivity extends Activity {
        // Distanza minima richiesta sull'asse X
        private static final int SWIPE_MIN_DISTANCE = 160;
        // Distanza massima consentita sull'asse Y
        private static final int SWIPE_MAX_OFF_PATH = 400;
        // Velocità minima richiesta sull'asse X
        private static final int SWIPE_THRESHOLD_VELOCITY = 150;

        private GestureDetector gestureDetector;
        View.OnTouchListener gestureListener;

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

                gestureDetector = new GestureDetector(new MyGestureDetector());
                gestureListener = new View.OnTouchListener() {
                        public boolean onTouch(View v, MotionEvent event) {
                                if (gestureDetector.onTouchEvent(event)) {
                                        return true;
                                }
                                return false;
                        }
                };
        }

        class MyGestureDetector extends SimpleOnGestureListener {
                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                        try {
                                if (Math.abs(e1.getY() - e2.getY()) > dp2px(SWIPE_MAX_OFF_PATH))
                                        return false;
                                // Swipe da destra a sinistra
                                if (e1.getX() - e2.getX() > dp2px(SWIPE_MIN_DISTANCE)
                                                && Math.abs(velocityX) > dp2px(SWIPE_THRESHOLD_VELOCITY)) {
                                        Toast.makeText(getApplicationContext(), "Swipe a sinistra", Toast.LENGTH_SHORT).show();
                                } else if (e2.getX() - e1.getX() > dp2px(SWIPE_MIN_DISTANCE)
                                                && Math.abs(velocityX) > dp2px(SWIPE_THRESHOLD_VELOCITY)) {
                                        Toast.makeText(getApplicationContext(), "Swipe a destra", Toast.LENGTH_SHORT).show();
                                }
                        } catch (Exception e) {
                                // nothing
                        }
                        return false;
                }
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
                if (gestureDetector.onTouchEvent(event))
                        return true;
                else
                        return false;
        }

        public float dp2px(int dip) {
                float scale = getResources().getDisplayMetrics().density;
                return dip * scale + 0.5f;
        }
}

Bibliografia:
« Ultima modifica: 08 Settembre 2010, 23:18:43 CEST da JD »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline The_Jag

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
    • Il Blog per le mie applicazioni Android
  • Dispositivo Android:
    Motorola Milestone
  • Play Store ID:
    Fabio Canovi
  • Sistema operativo:
    Ubuntu 10.10
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #1 il: 11 Ottobre 2010, 22:25:48 CEST »
0
Una domanda: ma è possibile utilizzare uno swipe su un elemento di una listview? Per capirci, come viene utilizzato su iPhone per mostrare il pulsante di cacellazione di una riga di una listview.

Grazie mille!
Il Blog per le mie applicazioni Android: http://android.canovifabio.com

Offline Twizer

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG P500
  • Sistema operativo:
    Windows 7
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #2 il: 06 Gennaio 2012, 09:56:28 CET »
0
Ciao, ho provato ad utilizzare questo tutorial su una mia applicazione che presenta 2 textview di cui una è il titolo e l'altra è il paragrafo posto all'interno di una scrollview.
Il codice funziona ma la gesture viene riconosciuta solo sul Titolo e non sul paragrafo.
E' possibile fare in modo che anche la textview "paragrafo" abbia questa funzione?

grazie

Offline Ormet

  • Utente junior
  • **
  • Post: 73
  • Respect: 0
    • Google+
    • Marco Falotico
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Play Store ID:
    Ormet
  • Sistema operativo:
    Windows 7
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #3 il: 25 Marzo 2012, 19:59:43 CEST »
0
Ottimo tutorial!!
sto utilizzando il metodo per effettuare le slide tra le pagine e volevo indicarvi che però, per farlo, il layout non deve essere una scrollview, perchè se no non funziona..spero di essere utile.
 ;-)

Offline Giusy

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    ACER liquid Mini
  • Sistema operativo:
    Mac OS X 10.5
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #4 il: 07 Aprile 2012, 12:23:11 CEST »
0
Salve, sto provando ad utilizzare questo tutorial per fare il passaggio da una schermata ad un'altra attraverso lo swipe, però non riesco a capire dove devo indicare la schermata (activity) da visualizzare dopo aver fatto lo swipe a destra oppure a sinistra!!! Vi ringrazio in anticipo per i vostri suggerimenti ...  :-)

Offline japper

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #5 il: 31 Luglio 2012, 13:06:39 CEST »
0
Ma GestureDetector ora è deprecato , conviene usare la tuo guida o no?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #6 il: 31 Luglio 2012, 14:03:42 CEST »
0
Ma GestureDetector ora è deprecato , conviene usare la tuo guida o no?
usa il viewpager... è nella supportlibrary
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline japper

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #7 il: 31 Luglio 2012, 14:28:22 CEST »
0
ok grz :)

Offline Eu4ia

  • Utente junior
  • **
  • Post: 93
  • Respect: +16
    • Mostra profilo
  • Play Store ID:
    Eu4ia
  • Sistema operativo:
    Ubuntu 11.10 + Windows 7
Re:[facile] Catturare le gesture di swipe/fling
« Risposta #8 il: 06 Marzo 2013, 14:44:52 CET »
0
Mi permetto di autoreferenziare il mio snippet per lo Swipe/Fling in 4 direzioni:
http://www.anddev.it/index.php/topic,10333.0.html

Magari torna utile a qualcuno  ;-)
Se ti sono stato utile premi "Thanks" ;-)