Orientação e movimento do dispositivo

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

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

Resumo

  • Detectar que lado do dispositivo está virado para cima e como o dispositivo está girando.
  • Saiba quando e como responder a eventos de orientação e movimentação.

Qual lado está para cima?

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

Frame de coordenada terrestre

O frame de coordenada terrestre, 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 (onde o leste é positivo).
Y Representa a direção norte-sul (onde o norte é positivo).
Z Representa a direção para cima e para baixo, perpendicular ao solo (onde para cima é positivo).

Frame de coordenada do dispositivo

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

O frame de coordenada 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 estendendo para longe.

Em um smartphone ou tablet, a orientação do dispositivo é baseada na orientação típica da tela. Para smartphones e tablets, ela é baseada no dispositivo estando no modo retrato. Para computadores desktop ou laptop, 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 de alfa no sistema de coordenadas do dispositivo
Ilustração de alfa no sistema de coordenadas do dispositivo

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

Beta

ilustração do frame de coordenadas do dispositivo
Ilustração de beta no sistema de coordenadas do dispositivo

A rotação em torno do eixo X. O valor de beta é 0° quando a parte superior e inferior do dispositivo estão equidistantes da superfície da Terra. O valor aumenta conforme a parte superior do dispositivo é inclinada em direção à superfície terrestre.

Gama

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

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

Orientação do dispositivo

O evento de orientação do dispositivo retorna dados de rotação, incluindo quanto o dispositivo está inclinando de frente para trás, lado a lado e, se o telefone ou laptop tiver uma bússola, a direção do dispositivo.

Use com moderação. Teste por suporte. Não atualize a interface do usuário em cada evento de orientação. Em vez disso, sincronize com requestAnimationFrame.

Quando usar eventos de orientação do dispositivo

Existem diversos usos para os eventos de orientação do dispositivo. Os exemplos incluem:

  • Atualizar um mapa conforme o usuário se movimenta.
  • Melhorias sutis na interface, por exemplo, adicionar efeitos de paralaxe.
  • Combinados com a geolocalização, podem ser usados para navegação por giro.

Busque suporte e ouça os eventos

Para detectar DeviceOrientationEvent, primeiro verifique se o navegador oferece suporte aos eventos. Em seguida, anexe um listener de eventos ao objeto window para detectar 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 sistema de coordenadas da Terra.

O evento geralmente retorna três propriedades: alpha, beta e gamma. No Mobile Safari, 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, incluindo quanto o dispositivo está inclinando de frente para trás, lado a lado e, se o telefone ou laptop tiver uma bússola, a direção do dispositivo.

Use a movimentação do dispositivo quando a movimentação atual do dispositivo for necessária. rotationRate é fornecido em °/s. acceleration e accelerationWithGravity são fornecidos em m/s2. Preste atenção às diferenças entre as implementações do navegador.

Quando usar eventos de movimentação do dispositivo

Existem diversos usos para os eventos de movimentação do dispositivo. Os exemplos incluem:

  • O gesto de balançar para atualizar dados.
  • Em jogos, para fazer o personagem pular ou se mover.
  • Para apps de saúde e fitness.

Busque suporte e ouça os eventos

Para detectar DeviceMotionEvent, primeiro verifique se o navegador oferece suporte aos eventos. Em seguida, anexe um listener de eventos ao objeto window para detectar eventos devicemotion.

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

Processar os eventos de movimento do dispositivo

O evento de movimentação do dispositivo é acionado em um intervalo regular e retorna dados sobre a rotação (em °/segundo) e aceleração (em m/segundo2) do dispositivo, naquele momento específico. 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 deixado sobre uma mesa plana, com a tela virada 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 telefone fosse segurado com a tela perpendicular ao chão e diretamente visível para quem olha:

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 forma de usar eventos de movimentação do dispositivo é calculando 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áximo (e mínimo) e, após o salto, informa ao usuário a aceleração máxima.

Feedback