Eu sei que no Safari em um iPhone você pode detectar a orientação da tela e mudar de orientação ouvindo o onorientationchange
evento e consultando window.orientation
o ângulo.
Isso é possível no navegador de telefones Android?
Para esclarecer, pergunto se a rotação de um dispositivo Android pode ser detectada pelo JavaScript em execução em uma página da web padrão. É possível em um iPhone, e me perguntei se isso poderia ser feito para telefones Android.
fonte
O comportamento real em diferentes dispositivos é inconsistente . Os eventos redimensionar e guidanceChange podem ser disparados em uma sequência diferente com frequência variável. Além disso, alguns valores (por exemplo, screen.width e window.orientation) nem sempre mudam quando você espera. Evite screen.width - ele não muda ao girar no iOS.
A abordagem confiável é ouvir os eventos de redimensionamento e de orientação e alterar (com algumas pesquisas como uma captura de segurança) e, eventualmente, você obterá um valor válido para a orientação. Nos meus testes, os dispositivos Android ocasionalmente falham em disparar eventos ao girar 180 graus, por isso também incluí um setInterval para pesquisar a orientação.
Aqui estão os resultados dos quatro dispositivos que testei (desculpe pela tabela ASCII, mas parecia a maneira mais fácil de apresentar os resultados). Além da consistência entre os dispositivos iOS, há muita variedade entre os dispositivos. NOTA: Os eventos são listados na ordem em que foram disparados.
fonte
previousOrientation
deve ser inicializado com a orientação atual:var previousOrientation = window.orientation;
Se você deseja ignorar rotações de 180 graus, ou seja, não precisa distinguir entre a paisagem esquerda ou direita e as variantes de cabeça para baixo ou não, adicione o seguinte como a primeira linha paracheckOrientation()
:if (0 === (previousOrientation + window.orientation) % 180) return;
No entanto, semsetTimeout
truques adicionais , você se beneficiará disso apenas no iOS, onde uma rotação rápida de 180 graus cria apenas um únicoorientationchange
evento.A excelente resposta do tolo de dois bits fornece todo o pano de fundo, mas deixe-me tentar um resumo conciso e pragmático de como lidar com as mudanças de orientação no iOS e no Android :
resize
apenas o evento.window.innerWidth
ewindow.InnerHeight
única.window.orientation
- não será atualizado no iOS.resize
evento no Android e somente oorientationchange
evento no iOS.window.orientation
(ewindow.innerWidth
ewindow.InnerHeight
)Essas abordagens oferecem pequenos benefícios sobre a lembrança da orientação anterior e a comparação:
window.orientation
não está disponível em navegadores de desktop).fonte
Você sempre pode ouvir o evento de redimensionamento da janela. Se, nesse caso, a janela passou de mais alta do que larga para mais larga do que alta (ou vice-versa), você pode ter certeza de que a orientação do telefone foi alterada.
fonte
É possível em HTML5.
Você pode ler mais (e experimentar uma demonstração ao vivo) aqui: http://slides.html5rocks.com/#slide-orientation .
Ele também suporta navegadores de mesa, mas sempre retornará o mesmo valor.
fonte
Eu tive o mesmo problema. Estou usando o Phonegap e o Jquery mobile, para dispositivos Adroid. Para redimensionar corretamente, tive que definir um tempo limite:
fonte
Aqui está a solução:
fonte
Outra dica: alguns tablets Android (o Motorola Xoom que acredito e um Elonex de baixo custo que estou testando, provavelmente outros também) têm seus acelerômetros configurados para que window.orientation == 0 no modo PAISAGEM, não retrato !
fonte
você pode experimentar a solução, compatível com todos os navegadores.
A seguir, é apresentada uma
orientationchange
foto de compatibilidade: portanto, euorientaionchange
autorio um polyfill, que é baseado no atributo @media para corrigir a biblioteca de utilitários de positionchange—— orientedchange -fixfonte
Vale ressaltar que, no Epic 4G Touch, tive que configurar a visualização na web para usar o WebChromeClient antes que qualquer uma das chamadas javascript no Android funcionasse.
fonte
Caminho entre navegadores
fonte
Uma pequena contribuição para a resposta do idiota:
Conforme descrito na tabela em telefones droid, o evento "orientedchange" é acionado antes do evento "redimensionar", bloqueando a próxima chamada de redimensionamento (por causa da instrução if). A propriedade Width ainda não está definida.
Uma solução alternativa, embora talvez não perfeita, poderia ser a de não acionar o evento "mudança de orientação". Isso pode ser arquivado envolvendo a ligação de evento "guidancechange" na instrução "if":
Espero que ajude
(testes foram feitos no Nexus S)
fonte