Sé que en Safari en un iPhone puedes detectar la orientación de la pantalla y el cambio de orientación al escuchar el onorientationchange
evento y consultar window.orientation
el ángulo.
¿Es esto posible en el navegador en teléfonos Android?
Para ser claros, pregunto si JavaScript puede detectar la rotación de un dispositivo Android que se ejecuta en una página web estándar. Es posible en un iPhone, y me preguntaba si podría hacerse para teléfonos Android.
fuente
El comportamiento real en diferentes dispositivos es inconsistente . Los eventos de cambio de tamaño y orientación pueden activarse en una secuencia diferente con frecuencia variable. Además, algunos valores (por ejemplo, screen.width y window.orientation) no siempre cambian cuando lo espera. Evite screen.width : no cambia al rotar en iOS.
El enfoque confiable es escuchar los eventos de cambio de tamaño y orientación ( cambiar algunas encuestas como captura de seguridad), y finalmente obtendrá un valor válido para la orientación. En mis pruebas, los dispositivos Android ocasionalmente no disparan eventos cuando giran 180 grados completos, por lo que también he incluido un setInterval para sondear la orientación.
Aquí están los resultados de los cuatro dispositivos que he probado (perdón por la tabla ASCII, pero parecía la forma más fácil de presentar los resultados). Además de la coherencia entre los dispositivos iOS, existe una gran variedad entre los dispositivos. NOTA: Los eventos se enumeran en el orden en que se dispararon.
fuente
previousOrientation
debe inicializarse con la orientación actual:var previousOrientation = window.orientation;
Si desea ignorar las rotaciones de 180 grados, es decir, no necesita distinguir entre el paisaje izquierdo o derecho y las variantes al revés o no, agregue lo siguiente como primera línea paracheckOrientation()
:if (0 === (previousOrientation + window.orientation) % 180) return;
Sin embargo, sinsetTimeout
trucos adicionales , solo se beneficiará de esto en iOS, donde una rotación rápida de 180 grados solo crea un evento únicoorientationchange
.La excelente respuesta de two-bit-fool proporciona todos los antecedentes, pero permítanme intentar un resumen conciso y pragmático de cómo manejar los cambios de orientación en iOS y Android :
resize
solo evento.window.innerWidth
ywindow.InnerHeight
solo.window.orientation
: no estará actualizado en iOS.resize
evento en Android y solo elorientationchange
evento en iOS.window.orientation
(ywindow.innerWidth
ywindow.InnerHeight
)Estos enfoques ofrecen ligeros beneficios sobre recordar la orientación previa y comparar:
window.orientation
no está disponible en navegadores de escritorio).fuente
Siempre puedes escuchar el evento de cambio de tamaño de la ventana. Si, en ese caso, la ventana pasó de ser más alta que ancha a más ancha que alta (o viceversa), puede estar bastante seguro de que la orientación del teléfono se acaba de cambiar.
fuente
Es posible en HTML5.
Puede leer más (y probar una demostración en vivo) aquí: http://slides.html5rocks.com/#slide-orientation .
También es compatible con los navegadores de escritorio, pero siempre devolverá el mismo valor.
fuente
Yo tuve el mismo problema. Estoy usando Phonegap y Jquery mobile, para dispositivos Adroid. Para cambiar el tamaño correctamente, tuve que establecer un tiempo de espera:
fuente
Aquí está la solución:
fuente
Otro problema: algunas tabletas Android (creo que la Motorola Xoom y una Elonex de gama baja en las que estoy haciendo algunas pruebas, probablemente otras también) tienen sus acelerómetros configurados de modo que window.orientation == 0 en modo PAISAJE, no vertical !
fuente
puedes probar la solución, compatible con todos los navegadores.
A continuación se muestra una
orientationchange
imagen de compatibilidad: por lo tanto, autor de unorientaionchange
polyfill, se basa en el atributo @media para corregir la biblioteca de utilidad de orientación de cambio—— orientación de cambio de orientaciónfuente
Vale la pena señalar que en mi Epic 4G Touch tuve que configurar la vista web para usar WebChromeClient antes de que funcionara cualquiera de las llamadas de Android javascript.
fuente
Navegador cruzado
fuente
Una pequeña contribución a la respuesta del tonto de dos bits:
Como se describe en la tabla en los teléfonos droides, el evento de "cambio de orientación" se dispara antes que el evento de "cambio de tamaño", lo que bloquea la siguiente llamada de cambio de tamaño (debido a la declaración if). La propiedad de ancho todavía no está establecida.
Una solución alternativa, aunque tal vez no sea perfecta, podría ser no disparar el evento de "cambio de orientación". Eso se puede archivar envolviendo el enlace de evento "orientación cambio" en la declaración "if":
Espero eso ayude
(las pruebas se realizaron en Nexus S)
fuente