Implementare gesture mobile javascript con hammerjs

Implementare gesture mobile javascript con hammerjs

A volte si ha bisogno di “usare” le gesture e fare delle azioni ad esempio, allo swipe dell’utente. Come fare? Scopriamolo insieme.

Principio di base con javascript vanilla

Usando un approccio senza librerie bisognerà adottare uno script di questo tipo:

//Gesture
                               document.addEventListener('touchstart', handleTouchStart, false); // event listeners
                               document.addEventListener('touchmove', handleTouchMove, false);
                               var xDown = null;
                               var yDown = null;
                               function handleTouchStart(evt) {
                                   xDown = evt.touches[0].clientX;
                                   yDown = evt.touches[0].clientY;
                               };
                               function handleTouchMove(evt) {
                                   if ( ! xDown || ! yDown ) {
                                       return;
                                   }
                                   var xUp = evt.touches[0].clientX;
                                   var yUp = evt.touches[0].clientY;
                                   var xDiff = xDown - xUp;
                                   var yDiff = yDown - yUp;
                                   if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {
                                       if ( xDiff > 0 ) {
                                           /* left swipe */
                                           console.log("LEFT Swipe");
                                       } else {
                                           /* right swipe */
                                          console.log("RIGHT Swipe");
                                       }
                                   } else {
                                       if ( yDiff > 0 ) {
                                           /* up swipe */
                                           console.log("UP Swipe");
                                       } else {
                                           /* down swipe */
                                           console.log("DOWN Swipe");
                                       }
                                   }
                                   /* reset values */
                                   xDown = null;
                                   yDown = null;
                               };
                               //Gesture

Ovviamente per testare su pc desktop dovrete aprire la pagina con ispeziona elemento –> emulatore mobile al fine di simulare il touch. In console in questo caso molto embrionale apparirà semplicemente lo stamp della direzione dello swipe.

Ma come funziona nello specifico? Analizziamo lo script passo-passo.

document.addEventListener('touchstart', handleTouchStart, false);
document.addEventListener('touchmove', handleTouchMove, false);

Con questi due event listeners andiamo a intercettare quando l’utente inizia e fa il movimento (ipotesi swipe). E’ possibile tuttavia andare a intercettare altri tipi di eventi come ad esempio touchend (il cui fire avviene al fine del touch). Come vedete ho collegato ai listeners due funzioni.

handleTouchStart

function handleTouchStart(evt) {
    xDown = evt.touches[0].clientX;
    yDown = evt.touches[0].clientY;
};

handleTouchStart va a prelevare i parametri y e x di dove è iniziato l’evento. Le variabili x e y vengono pertanto popolate.

handleTouchMove

function handleTouchMove(evt) {
        if ( ! xDown || ! yDown ) {
            return;
        }
        var xUp = evt.touches[0].clientX;
        var yUp = evt.touches[0].clientY;
        var xDiff = xDown - xUp;
        var yDiff = yDown - yUp;
        if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {
            if ( xDiff > 0 ) {
                /* left swipe */
                console.log("LEFT Swipe");
            } else {
                /* right swipe */
               console.log("RIGHT Swipe");
            }
        } else {
            if ( yDiff > 0 ) {
                /* up swipe */
                console.log("UP Swipe");
            } else {
                /* down swipe */
                console.log("DOWN Swipe");
            }
        }
        /* reset values */
        xDown = null;
        yDown = null;
    };

handleTouchMove va invece a verificare che l’utente si sia mosso, ed estrapola in che direzione sul piano cartesiano. A seconda della differenza saremo capaci di intercettare da che parte l’utente ha fatto swipe.

  • xDiff: swipe orizzontale
  • yDiff: swipe verticale

Usiamo una libreria più avanzata chiamata hammerjs

Come avrete immaginato è facile trovare diversi limiti allo script sopra-indicato. Personalmente lo trovo utile nel caso non vi serva qualcosa di troppo complesso, implementabile con vanilla javascript senza librerie di sorta (che non fa mai male).

Nel caso dobbiate realizzare qualcosa di più complesso, vi consiglio la libreria hammerjs.

Questa libreria vi consente di intercettare meglio i vari eventi touch non solo relativi al movimento ma anche al tocco (tab, doppio o triplo tap e così via).  Oltre a questo rimuove il “delay dei 300ms”. se non sapete di cosa si tratta a questo indirizzo troverete un articolo “milestone” sull’argomento.

Ma andiamo a vedere nel dettaglio come si usa hammerjs.

Implementare gesture mobile javascript con hammerjs: utilizzo

Il primo passo è quello di integrare le librerie js sul vostro sito. Sono disponibili al download sul sito ufficiale ma lo sono anche su diversi cdn online “plug and play”.

Una volta messo il file js andiamo a specificare su che area “restare in ascolto di touch” e inizializzamo la variabile “hammer”.

var touchArea = document.body; //in questo caso tutto il documento ma può essere benissimo anche solo un div
var mc = new Hammer(touchArea);

 

A questo punto all’interno del DOM vi basterà andare a inizializzare le varie gesture, a seconda di quello che vi serve.

mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
mc.add(new Hammer.Swipe({ threshold: 25, velocity: 2 })).recognizeWith(mc.get('pan'));
mc.add(new Hammer.Rotate({ threshold: 0 })).recognizeWith(mc.get('pan'));
mc.add(new Hammer.Pinch({ threshold: 0 })).recognizeWith([mc.get('pan'), mc.get('rotate')]);
mc.add(new Hammer.Tap({ event: 'doubletap', taps: 2 }));
mc.add(new Hammer.Tap());

Questo esempio è abbastanza completo e consente l’uso delle principali gesture.

Una volta comunicato ad hammer “cosa volete usare” andiamo a specificare “cosa fare quando si manifesta quell’evento”.

mc.on("pan", onPan); //evento base di tocco
mc.on("rotatestart rotatemove", onRotate);
mc.on("pinchstart pinchmove", onPinch);
mc.on("swipe", onSwipe); // basta anche solo questo nel caso vi serva solo vedere quando l'utente fa swipe
mc.on("swipeup", onSwipeUp);
mc.on("swipedown", onSwipeDown);
mc.on("swipeleft", onSwipeLeft);
mc.on("swiperight", onSwipeRight);
mc.on("tap", onTap);
mc.on("doubletap", onDoubleTap);

A questo punto vi basterà creare una funzione per ognuna di quelle assegnate nei vari mc.on come segue:

function onSwipeUp(ev) {
     console.log(ev.type);
}

(ovviamente evito di scriverle tutte).

Nel caso voleste disattivare il listener touch di hammerjs potete farlo andando ad agire come segue:

mc.get('pan').set({ enable: false }); // true per riattivarlo

Problema hammerjs: scroll verticale non funziona

Di solito il problema si verifica se state usando la versione 2.x.

Se lo scroll verticale non funziona una volta attivato il tutto provate ad impostare la seguente opzione su Hammerjs:

var mc = new Hammer(touchArea,{ "touchAction": "pan-y" });

Questo articolo ti è stato utile? Condividilo sui tuoi socials preferiti!

Image credits “touch” disponibile su Shutterstock

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Up Next:

Le 6 piattaforme migliori per creare un logo

Le 6 piattaforme migliori per creare un logo