Orientação e movimento do dispositivo

Os eventos de movimento e orientação do dispositivo fornecem acesso ao acelerômetro, giroscópio e bússola integrados em dispositivos móveis.

Esses eventos podem ser usados para muitas finalidades. Em jogos, por exemplo, para controlar a direção ou ação de um personagem. Quando usados com a geolocalização, eles podem ajudar a criar uma navegação passo a passo mais precisa ou fornecer informações sobre um local específico.

Resumo

  • Detecta qual lado do dispositivo está para cima e como ele está girando.
  • Saiba quando e como responder a eventos de movimento e orientação.

Qual lado está para cima?

Para usar os dados retornados pelos eventos de orientação e movimento do dispositivo, é importante entender os valores fornecidos.

Sistema de coordenadas da Terra

O sistema de coordenadas da Terra, descrito pelos valores X, Y e Z, é alinhado com base na gravidade e na orientação magnética padrão.

Sistema de coordenadas
X Representa a direção leste-oeste (em que o leste é positivo).
Y Representa a direção norte-sul (em que o norte é positivo).
Z Representa a direção para cima e para baixo, perpendicular ao solo (em que para cima é positivo).

Frame de coordenadas do dispositivo

Ilustração do frame de coordenadas do dispositivo
Ilustração do frame de coordenadas do dispositivo

O frame de coordenadas do dispositivo, descrito pelos valores x, y e z, é alinhado com base no centro do dispositivo.

Sistema de coordenadas
X No plano da tela, positivo para a direita.
Y No plano da tela, positivo em direção ao topo.
Z Perpendicular à tela ou ao teclado, positivo se afastando.

Em um smartphone ou tablet, a orientação do dispositivo é baseada na orientação típica da tela. Para smartphones e tablets, é baseado no dispositivo estar no modo retrato. Para computadores desktop ou laptops, a orientação é considerada em relação ao teclado.

Dados de rotação

Os dados de rotação são retornados como um ângulo de Euler, representando o número de graus de diferença entre o frame de coordenadas do dispositivo e o frame de coordenadas da Terra.

Alfa

Ilustração do alfa no frame de coordenadas do dispositivo
Ilustração do Alfa na moldura de coordenadas do dispositivo

A rotação em torno do eixo z. O valor de alpha é 0° quando a parte de cima do dispositivo está apontada diretamente para o norte. À medida que o dispositivo é girado no sentido anti-horário, o valor de alpha aumenta.

Beta

ilustração do frame de coordenadas do dispositivo
Ilustração da versão Beta no frame de coordenadas do dispositivo

A rotação em torno do eixo x. O valor de beta é 0° quando a parte de cima e a parte de baixo do dispositivo estão equidistantes da superfície da Terra. O valor aumenta à medida que a parte de cima do dispositivo é inclinada em direção à superfície da Terra.

Gama

ilustração do frame de coordenadas do dispositivo
Ilustração de gama no frame de coordenadas do dispositivo

A rotação em torno do eixo y. O valor de gamma é 0° quando as bordas esquerda e direita do dispositivo estão equidistantes da superfície da Terra. O valor aumenta à medida que o lado direito é inclinado em direção à superfície da Terra.

Orientação do dispositivo

O evento de orientação do dispositivo retorna dados de rotação, que incluem o quanto o dispositivo está inclinado de frente para trás, de lado para lado e, se o smartphone ou laptop tiver uma bússola, a direção para a qual o dispositivo está voltado.

Use com moderação. Teste o suporte. Não atualize a interface em todos os eventos de orientação. Em vez disso, sincronize com requestAnimationFrame.

Quando usar eventos de orientação do dispositivo

Há vários usos para eventos de orientação do dispositivo. Os exemplos incluem:

  • Atualize um mapa conforme o usuário se move.
  • Ajustes sutis na interface, por exemplo, adicionar efeitos de paralaxe.
  • Combinado com a geolocalização, pode ser usado para navegação guiada.

Verificar o suporte e detectar eventos

Para detectar DeviceOrientationEvent, primeiro verifique se o navegador oferece suporte aos eventos. Em seguida, anexe um listener de eventos ao objeto window que detecta eventos deviceorientation.

if (window.DeviceOrientationEvent) {
  window.addEventListener('deviceorientation', deviceOrientationHandler, false);
  document.getElementById('doeSupported').innerText = 'Supported!';
}

Processar os eventos de orientação do dispositivo

O evento de orientação do dispositivo é acionado quando o dispositivo se move ou muda de orientação. Ele retorna dados sobre a diferença entre o dispositivo na posição atual em relação ao marco de coordenadas da Terra.

O evento geralmente retorna três propriedades: alpha, beta e gamma. No Safari para dispositivos móveis, um parâmetro adicional webkitCompassHeading é retornado com a direção da bússola.

Movimento do dispositivo

O evento de orientação do dispositivo retorna dados de rotação, que incluem o quanto o dispositivo está inclinado de frente para trás, de lado para lado e, se o smartphone ou laptop tiver uma bússola, a direção para a qual o dispositivo está voltado.

Use o movimento do dispositivo quando o movimento atual do dispositivo for necessário. O rotationRate é fornecido em °/s. acceleration e accelerationWithGravity são fornecidos em m/s2. Fique atento às diferenças entre as implementações do navegador.

Quando usar eventos de movimento do dispositivo

Há vários usos para os eventos de movimento do dispositivo. Os exemplos incluem:

  • Agite o dispositivo para atualizar os dados.
  • Em jogos, para fazer com que os personagens pulem ou se movam.
  • Para apps de saúde e fitness.

Verificar o suporte e detectar eventos

Para detectar DeviceMotionEvent, primeiro verifique se os eventos são compatíveis com o navegador. Em seguida, anexe um listener de eventos ao objeto window que detecta eventos devicemotion.

if (window.DeviceMotionEvent) {
  window.addEventListener('devicemotion', deviceMotionHandler);
  setTimeout(stopJump, 3 * 1000);
}

Processar os eventos de movimento do dispositivo

O evento de movimento do dispositivo é acionado em um intervalo regular e retorna dados sobre a rotação (em °/segundo) e a aceleração (em m/segundo2) do dispositivo, naquele momento. Alguns dispositivos não têm o hardware para excluir o efeito da gravidade.

O evento retorna quatro propriedades, accelerationIncludingGravity, acceleration, que exclui os efeitos da gravidade, rotationRate e interval.

Por exemplo, vamos analisar um smartphone, que está sobre uma mesa plana, com a tela voltada para cima.

Estado Rotação Aceleração (m/s2) Aceleração com gravidade (m/s2)
Nenhum movimento detectado [0, 0, 0] [0, 0, 0] [0, 0, 9,8]
Movimento para cima em direção ao céu [0, 0, 0] [0, 0, 5] [0, 0, 14,81]
Mover apenas para a direita [0, 0, 0] [3, 0, 0] [3, 0, 9,81]
Movendo para cima e para a direita [0, 0, 0] [5, 0, 5] [5, 0, 14.81]

Por outro lado, se o smartphone fosse segurado de modo que a tela ficasse perpendicular ao chão e fosse diretamente visível para o espectador:

Estado Rotação Aceleração (m/s2) Aceleração com gravidade (m/s2)
Nenhum movimento detectado [0, 0, 0] [0, 0, 0] [0, 9,81, 0]
Movimento para cima em direção ao céu [0, 0, 0] [0, 5, 0] [0, 14,81, 0]
Mover apenas para a direita [0, 0, 0] [3, 0, 0] [3, 9,81, 0]
Movendo para cima e para a direita [0, 0, 0] [5, 5, 0] [5, 14,81, 0]

Exemplo: calcular a aceleração máxima de um objeto

Uma maneira de usar eventos de movimento do dispositivo é calcular a aceleração máxima de um objeto. Por exemplo, qual é a aceleração máxima de uma pessoa pulando?

if (evt.acceleration.x > jumpMax.x) {
  jumpMax.x = evt.acceleration.x;
}
if (evt.acceleration.y > jumpMax.y) {
  jumpMax.y = evt.acceleration.y;
}
if (evt.acceleration.z > jumpMax.z) {
  jumpMax.z = evt.acceleration.z;
}

Depois de tocar no botão "Go!", o usuário é instruído a pular. Durante esse tempo, a página armazena os valores de aceleração máximos (e mínimos) e, após o salto, informa ao usuário a aceleração máxima.

Feedback