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

Os desenvolvedores que trabalham em apps da Web virtuais ou de realidade aumentada são com certeza familiarizados com o DeviceOrientationEvent. Para iniciantes, "This End Up: Using Device Orientation" oferece uma ótima visão geral de como um listener de eventos deviceorientation pode responder a um dispositivo girando e girando.

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

O que está mudando?

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

Mas eu ainda preciso de diplomas 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 para o mundo físico, não fica sem sorte. O comportamento anterior, que depende do magnetômetro do dispositivo, está disponível por um novo evento deviceorientationabsolute. Do ponto de vista de um desenvolvedor, isso é análogo ao DeviceOrientationEvent existente, com a garantia de que a propriedade absolute será definida como true.

Como detectar o que tem suporte

Os desenvolvedores que preferem graus absolutos podem usar a detecção de recursos para determinar se estão usando um navegador com suporte ao 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 entre navegadores

Os valores informados no DeviceOrientationEvent nunca foram consistentes.

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

O Firefox (em outras plataformas que não sejam o iOS), o Edge e as versões do Chrome anteriores a 50 usam valores de grau absolutos para o DeviceOrientationEvent quando executado em dispositivos com os sensores adequados.

No momento, o Chrome 50 é o primeiro navegador compatível com o novo DeviceOrientationAbsoluteEvent.

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

O Boris Smus (link em inglês) tem um artigo superdetalhado que mostra algumas desvantagens do uso do DeviceOrientationEvent e como implementar uma fusão de sensores personalizados usando DeviceMotionEvents. Elas oferecem 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 os usuários.

Outros recursos