Aprenda como detectar o movimento do dispositivo sem nenhuma biblioteca.
Para detectar um agito, usamos a API devicemotion do navegador. Este tutorial aborda a matemática, os requisitos de permissão do iOS e a implementação final.
O acelerômetro fornece valores para os eixos X, Y e Z. Para detectar um agito independentemente da orientação do telefone, calculamos a magnitude total do vetor de aceleração.
Usamos accelerationIncludingGravity. Um telefone parado tem uma magnitude de aproximadamente 9.8 (gravidade da Terra). Um agito geralmente produz um pico acima de 15 ou 20.
iPhones modernos exigem que o usuário conceda permissão manualmente para usar sensores de movimento. Você não pode apenas começar a ouvir; deve acionar a solicitação por meio de uma interação do usuário, como um clique de botão.
function requestPermission() {
if (typeof DeviceMotionEvent.requestPermission === 'function') {
DeviceMotionEvent.requestPermission()
.then(response => {
if (response == 'granted') {
window.addEventListener('devicemotion', handleMotion);
}
})
.catch(console.error);
} else {
// Dispositivos não-iOS não precisam de permissão
window.addEventListener('devicemotion', handleMotion);
}
}
Adicionamos um temporizador "Debounce". Sem isso, um único agito físico poderia disparar o código 50 vezes em um segundo. Forçamos o código a esperar (ex: 1000ms) antes de detectar um novo agito.
let lastShake = 0;
const MIN_INTERVAL = 1000; // Aguarde 1 seg entre agitos
function handleMotion(event) {
const acc = event.accelerationIncludingGravity;
if (!acc) return;
// Calcular Magnitude
const total = Math.sqrt(acc.x**2 + acc.y**2 + acc.z**2);
// Limite de 15 é um bom ponto de partida
if (total > 15) {
const now = Date.now();
if (now - lastShake > MIN_INTERVAL) {
lastShake = now;
alert("Agito Detectado!");
}
}
}
Teste o código aqui mesmo. Se estiver em um dispositivo móvel, clique no botão abaixo e agite seu telefone.