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
DeviceOrientationEvent
s 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 DeviceOrientationEvent
s 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
DeviceMotionEvent
s.
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.