Определение Android Отмена / Размах назад (проведите пальцем влево-вправо) с помощью jQuery
На Android, без использования фреймворка, такого как Sencha или JQTouch или JQMobile, но с использованием jQuery (обычный jQuery), я хочу обнаружить Отмена / Обратный удар (смахивание слева направо). Пока что у меня есть кое-что выполненное, но я пытаюсь определить математическую формулу для реализации в jQuery так, чтобы я записывал событие свайпинга слева направо, а не другой вид жеста. Что ты предлагаешь? Я полагаю, мне нужна какая-то приемлемая разница. Я предполагаю, что есть какая-то формула исчисления, которую можно было бы применить здесь, но, к сожалению, я уклонился от исчисления в колледже. Так что, ваш ответ, я надеюсь, научит меня.
Вот некоторые примеры данных начала и окончания x,y для игры:
(а) Проведите по диагонали от среднего левого до верхнего правого (нежелательный жест в этом случае)
21 269 - 278,85
(б) Проведите по диагонали от среднего левого угла к нижнему правому (в этом случае это нежелательный жест)
13,269 - 331,436
(в) Проведите прямо (вроде) от середины слева до середины справа (желательный жест)
34 267 - 326 266
или же
36 494 - 355 479
var gnStartX = 0;
var gnStartY = 0;
var gnEndX = 0;
var gnEndY = 0;
window.addEventListener('touchstart',function(event) {
gnStartX = event.touches[0].pageX;
gnStartY = event.touches[0].pageY;
},false);
window.addEventListener('touchmove',function(event) {
gnEndX = event.touches[0].pageX;
gnEndY = event.touches[0].pageY;
},false);
window.addEventListener('touchend',function(event) {
alert('START (' + gnStartX + ', ' + gnStartY + ') END (' + gnEndX + ', ' + gnEndY + ')');
},false);
2 ответа
Методом проб и ошибок я обнаружил, насколько это может быть просто, исчисление не требуется. Время в миллисекундах должно быть достаточно быстрым, поэтому 350 мс или меньше. Дисперсия Y должна быть +40 или -40. Расстояние должно быть 240 пикселей.
Однако обратите внимание, что я использую этот тег META в своем коде относительно независимых от устройства пикселей:
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
И то, как я обрабатываю событие возврата / отмены смахивания:
var gnStartX = 0;
var gnStartY = 0;
var gnStartTime = 0;
var gnEndX = 0;
var gnEndY = 0;
var gnEndTime = 0;
window.addEventListener('touchstart',function(event) {
gnStartX = event.touches[0].pageX;
gnStartY = event.touches[0].pageY;
gnStartTime = Number(new Date());
},false);
window.addEventListener('touchmove',function(event) {
gnEndX = event.touches[0].pageX;
gnEndY = event.touches[0].pageY;
gnEndTime = Number(new Date());
},false);
window.addEventListener('touchend',function(event) {
var nDiffTime = gnEndTime - gnStartTime;
var nDiffX = gnEndX - gnStartX;
var nDiffY = gnEndY - gnStartY;
// is this a swipe back/cancel event?
if ((nDiffTime <= 350) && (nDiffX >= 240) && (nDiffY >= -40) && (nDiffY <= 40)) {
event.preventDefault();
goBack();
}
},false);
Для этого нужно просто реализовать собственную функцию goBack().
Возможно, хорошим индикатором намерения смахивания может быть наклон линии смахивания:
var nDiffX = gnEndX - gnStartX;
var nDiffY = gnEndY - gnStartY;
var nSlope = nDiffY / Math.max(0.001,nDiffX);
if ((nDiffTime <= 350) && (Math.abs(nDiffX) >= 240)) {
event.preventDefault();
if ((nSlope > -0.125)&&(nSlope < 0.125)) {
// Between lines of 1/8 and -1/8 slope - close enough to straight horizontal
if (nDiffX > 0) {
// Swiped to the right
} else {
// Swiped to the left
}
}
goBack();
}
Точно так же вы можете проверить, приближается ли наклон к 1 для смахивания вверх-вправо или вниз-влево, -1 для смещения вверх-влево или вниз-вправо.