Mudanças na orientação do dispositivo serão lançadas para o Chrome 50

Os desenvolvedores que trabalham com apps da Web de realidade virtual ou aumentada certamente conhecem o DeviceOrientationEvent. Para quem não conhece, o artigo This End Up: Using Device Orientation oferece uma ótima visão geral de como um listener de eventos deviceorientation pode responder a uma torção e uma rotação do dispositivo.

Nas versões anteriores do Chrome, os valores alpha, beta e gamma incluídos no DeviceOrientationEvent eram fornecidos como graus absolute em relação ao marco de coordenadas da Terra. Para fornecer graus absolutos, é necessário usar o sensor de magnetômetro do dispositivo para detectar o campo magnético da Terra, que, por sua vez, é suscetível a flutuações do campo magnético próximo que podem afetar as leituras. Na prática, isso pode levar um app da Web a registrar vários DeviceOrientationEvents devido a um ímã próximo, mesmo que o dispositivo não se mova. Para um aplicativo de realidade virtual que se preocupa apenas em rastrear mudanças na orientação, esse ruído magnético é uma má notícia.

O que muda?

A partir do Chrome 50, os graus incluídos no DeviceOrientationEvent não são mais absolutos em relação ao marco de coordenadas da Terra por padrão. Isso significa que os DeviceOrientationEvents só podem ser acionados quando há um movimento real, detectado por alguma combinação do acelerômetro e do giroscópio de um dispositivo. O magnetômetro e as leituras falsas devido a flutuações do campo magnético estão fora de questão.

Mas ainda preciso de graus absolutos.

Se você estiver escrevendo JavaScript que precisa usar graus absolutos, talvez como parte de um aplicativo da Web de realidade aumentada que precisa ser mapeado diretamente no mundo físico, você não está sem sorte. O comportamento anterior, dependente do magnetômetro de um dispositivo, está disponível por um novo evento deviceorientationabsolute. Do ponto de vista do desenvolvedor, é análogo ao DeviceOrientationEvent atual, com a garantia de que a propriedade absolute será definida como true.

Como detectar o que é compatível

Os desenvolvedores que preferem graus absolutos podem usar a detecção de recursos para determinar se estão em um navegador compatível com o novo evento DeviceOrientationAbsoluteEvent:

if ('ondeviceorientationabsolute' in window) {
    // We can listen for the new deviceorientationabsolute event.
} else if ('ondeviceorientation' in window) {
    // We can still listen for deviceorientation events.
    // The `absolute` property of the event tells us whether
    // or not the degrees are absolute.
}

Compatibilidade com vários navegadores

Os valores informados no DeviceOrientationEvent nunca foram consistentes.

O Safari e o Firefox no iOS usam valores relativos para os graus, que correspondem à mudança de implementação introduzida no Chrome 50. A mudança deve levar a mais consistência com aplicativos da Web que foram criados pensando no iOS.

O Firefox (em plataformas diferentes do iOS), o Edge e as versões anteriores do Chrome anteriores à 50 usam valores de grau absoluto para oDeviceOrientationEvent quando executados em dispositivos com os sensores adequados.

No momento em que este artigo foi escrito, o Chrome 50 era o primeiro navegador com suporte ao novo DeviceOrientationAbsoluteEvent.

Rastreamento avançado de orientação com o DeviceMotionEvent

Boris Smus tem um artigo fantástico que detalha algumas das desvantagens do uso da DeviceOrientationEvent e como implementar uma fusão de sensores personalizada usando DeviceMotionEvents. Eles fornecem acesso de baixo nível ao acelerômetro e ao giroscópio e podem levar a uma experiência de realidade virtual mais precisa para seus usuários.

Outros recursos