2013-02-26 17 views
36

Ho un'applicazione fatta in AngularJS che ha la navigazione con i tasti freccia per cambiare vista.Come implementare i gesti di scorrimento per i dispositivi mobili?

Desidero implementare questa navigazione utilizzando lo scorrimento per i dispositivi touch. Ho provato la libreria jGestures ma non funziona bene con lo scorrimento. Mi è stato consigliato di NON usare jquery mobile.

Esiste un altro modo per implementare lo scorrimento?

MODIFICA: Non rileva lo scorrimento in modo pulito. L'ho provato su più dispositivi, incluso l'iPad e sono necessari più passaggi per eseguire un'azione (instradamento nel mio caso).

+0

Potresti voler approfondire i problemi che hai avuto con jGestures. Non l'ho usato da solo, ma sembra una versione robusta del codice personalizzato che ho scritto per il semplice supporto dei gesti (e visto altrove). –

+0

Aggiunti in modifica. – fotuzlab

+0

"Mi è stato consigliato NON usare jquery mobile." perché? – givanse

risposta

23

Hai provato Hammerjs? Supporta gesti di scorrimento utilizzando la velocità del tocco. http://eightmedia.github.com/hammer.js/

+0

Ho usato http://quojs.tapquo.com/. Ha funzionato bene. Ho sentito molti aspetti positivi di HammerJS, l'avrei provato in qualche altro progetto. Grazie per la risposta. – fotuzlab

+0

Ho scritto un servizio semplice con Hammerjs. Funziona alla grande con Angular. –

+0

Grazie per la raccomandazione! hammerjs funziona con la versione corrente di JQuery senza dover eseguire la migrazione di jquery.mobile. Nessun avviso, nessun errore. SIMPATICO! –

33

Ho fatto questa funzione per le mie esigenze.

Sentitevi liberi di usarlo. Funziona alla grande sui dispositivi mobili.

function detectswipe(el,func) { 
    swipe_det = new Object(); 
    swipe_det.sX = 0; swipe_det.sY = 0; swipe_det.eX = 0; swipe_det.eY = 0; 
    var min_x = 30; //min x swipe for horizontal swipe 
    var max_x = 30; //max x difference for vertical swipe 
    var min_y = 50; //min y swipe for vertical swipe 
    var max_y = 60; //max y difference for horizontal swipe 
    var direc = ""; 
    ele = document.getElementById(el); 
    ele.addEventListener('touchstart',function(e){ 
    var t = e.touches[0]; 
    swipe_det.sX = t.screenX; 
    swipe_det.sY = t.screenY; 
    },false); 
    ele.addEventListener('touchmove',function(e){ 
    e.preventDefault(); 
    var t = e.touches[0]; 
    swipe_det.eX = t.screenX; 
    swipe_det.eY = t.screenY;  
    },false); 
    ele.addEventListener('touchend',function(e){ 
    //horizontal detection 
    if ((((swipe_det.eX - min_x > swipe_det.sX) || (swipe_det.eX + min_x < swipe_det.sX)) && ((swipe_det.eY < swipe_det.sY + max_y) && (swipe_det.sY > swipe_det.eY - max_y) && (swipe_det.eX > 0)))) { 
     if(swipe_det.eX > swipe_det.sX) direc = "r"; 
     else direc = "l"; 
    } 
    //vertical detection 
    else if ((((swipe_det.eY - min_y > swipe_det.sY) || (swipe_det.eY + min_y < swipe_det.sY)) && ((swipe_det.eX < swipe_det.sX + max_x) && (swipe_det.sX > swipe_det.eX - max_x) && (swipe_det.eY > 0)))) { 
     if(swipe_det.eY > swipe_det.sY) direc = "d"; 
     else direc = "u"; 
    } 

    if (direc != "") { 
     if(typeof func == 'function') func(el,direc); 
    } 
    direc = ""; 
    swipe_det.sX = 0; swipe_det.sY = 0; swipe_det.eX = 0; swipe_det.eY = 0; 
    },false); 
} 

function myfunction(el,d) { 
    alert("you swiped on element with id '"+el+"' to "+d+" direction"); 
} 

Per utilizzare la funzione appena usarlo come

detectswipe('an_element_id',myfunction); 

detectswipe('an_other_element_id',my_other_function); 

Se un colpo viene rilevata la funzione "myfunction" si chiama con il parametro elemento id e "l, r, u, d" (sinistra, destra, su, giù).

Esempio: http://jsfiddle.net/rvuayqeo/1/

+0

Grazie. Ti consiglio di impostare 'min_x' in modo dinamico:' min_x = Math.abs (swipe_det.eY - swipe_det.sY) '. Analogico per altra direzione. Perché quando fai scorrere 400px su e solo a destra a 40px, probabilmente intendi scorrere verso l'alto. Tuttavia, il tuo codice riconoscerebbe lo swipe giusto. – Sadik

+1

@EscapeNetscape Mi piace la tua soluzione per il rilevamento dello scorrimento. Ma identifica erroneamente singoli e doppi tocchi come swipes. Come andrei a ripararlo? – theJollySin

3

La soluzione più semplice che ho trovato che non richiede un plugin è givanse's answer a una domanda simile:

document.addEventListener('touchstart', handleTouchStart, false);   
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)) {/*most significant*/ 
    if (xDiff > 0) { 
     /* left swipe */ 
    } else { 
     /* right swipe */ 
    }      
} else { 
    if (yDiff > 0) { 
     /* up swipe */ 
    } else { 
     /* down swipe */ 
    }                 
} 
/* reset values */ 
xDown = null; 
yDown = null;            
}; 
1

tempo Hammer!

Ho usato Hammer JS e funziona con gesti. Leggi i dettagli da qui: https://hammerjs.github.io/

Buona cosa che è molto più leggero e veloce quindi jQuery mobile. Puoi testarlo anche sul loro sito web.

0

Mi piace la tua soluzione e l'ho implementata sul mio sito - tuttavia, con alcuni piccoli miglioramenti.Volevo solo condividere il mio codice:

function detectSwipe(id, f) { 
    var detect = { 
     startX: 0, 
     startY: 0, 
     endX: 0, 
     endY: 0, 
     minX: 30, // min X swipe for horizontal swipe 
     maxX: 30, // max X difference for vertical swipe 
     minY: 50, // min Y swipe for vertial swipe 
     maxY: 60 // max Y difference for horizontal swipe 
    }, 
     direction = null, 
     element = document.getElementById(id); 

    element.addEventListener('touchstart', function (event) { 
     var touch = event.touches[0]; 
     detect.startX = touch.screenX; 
     detect.startY = touch.screenY; 
    }); 

    element.addEventListener('touchmove', function (event) { 
     event.preventDefault(); 
     var touch = event.touches[0]; 
     detect.endX = touch.screenX; 
     detect.endY = touch.screenY; 
    }); 

    element.addEventListener('touchend', function (event) { 
     if (
      // Horizontal move. 
      (Math.abs(detect.endX - detect.startX) > detect.minX) 
       && (Math.abs(detect.endY - detect.startY) < detect.maxY) 
     ) { 
      direction = (detect.endX > detect.startX) ? 'right' : 'left'; 
     } else if (
      // Vertical move. 
      (Math.abs(detect.endY - detect.startY) > detect.minY) 
       && (Math.abs(detect.endX - detect.startX) < detect.maxX) 
     ) { 
      direction = (detect.endY > detect.startY) ? 'down' : 'up'; 
     } 

     if ((direction !== '') && (typeof f === 'function')) { 
      f(element, direction); 
     } 
    }); 
} 

utilizzarlo come:

detectSwipe('an_element_id', myfunction); 

O

detectSwipe('another_element_id', my_other_function); 

Se viene rilevato un colpo la funzione myfunction si chiama con il parametro elemento-id e 'left' , 'right', 'up' o 'down'.

Problemi correlati