android - samsung - porque no gira la pantalla de mi celular
Deshabilitar la animaciĆ³n predeterminada de Vertical a Horizontal (8)
Tengo una aplicación con varias actividades "normales" que se pueden ejecutar en paisaje o retrato. Están diseñados y se utilizan principalmente en el retrato.
Esta aplicación tiene una sola actividad que utiliza la cámara y está bloqueada en el paisaje. I ''simular'' esta actividad está en retrato girando imágenes y textos 90 grados, por lo que se parece al resto de las actividades.
En algunos dispositivos, como Samsung Galaxy Tab 7 y Galaxy S3, se muestra una animación de rotación al pasar de una actividad de retrato normal a una actividad de paisaje de la cámara y viceversa . Esto es confuso para el usuario porque la actividad del paisaje simula estar en el retrato.
¿Hay alguna manera de eliminar esta animación de rotación ? Idealmente, me gustaría cambiar a la animación predeterminada de retrato a retrato, pero basta con eliminar la animación de rotación.
He intentado
overridePendingTransition(0, 0);
otras variaciones de ese método sin éxito.
[ADICIONAL]
Siguiendo las sugerencias de @igalarzab, @Georg y @Joe, he hecho esto (todavía sin suerte):
- Se agregó android: configChanges = "orientation | screenSize" a Manifest
- Agregado en la configuración cambiada
- Creó una animación ficticia que no hace nada y agregó la anulación de Transición rápida (R.anim.nothing, R.anim.nothing);
Tuve estos resultados:
- onConfigurationChanged se invoca solo cuando se rota la misma actividad (Actividad A en retrato -> Actividad A en paisaje). Pero no se llama cuando se pasa de la Actividad A en el retrato -> Actividad B en el paisaje
- Esto evitó que la actividad se reiniciara al girar, pero NO eliminó la animación de rotación (probada en Galaxy S3, Galaxy Nexus, Galaxy Tab 7.0 y Galaxy Tab 10.1)
- anular la transición de publicación (R.anim.nothing, R.anim.nothing); eliminó las transiciones normales (retrato-> retrato y paisaje-> paisaje) pero no eliminó la animación de rotación (retrato-> paisaje y viceversa).
[VÍDEO]
Subí un video que muestra la animación que quiero deshabilitar. Esto sucede cuando se cambia de la actividad de la cámara (bloqueada a horizontal) a otra actividad mientras se sostiene el teléfono en el retrato:
Puede configurar en AndroidManifest una propiedad llamada android: configChanges donde puede decidir qué cambios desea administrar en el código. De esta forma, la animación de cambio de rotación se desactivará y podrá manejarla como lo desee en el método onConfigurationChanged de su Actividad.
Esto debería funcionar, pero de acuerdo con esta página , también debe agregar screenSize a configChanges agregando android: configChanges = "orientation | screenSize" a su etiqueta de actividad.
Contra ellos que dijeron que no, yo digo que sí, es posible y ¡es muy simple! Lo primero puede sonar estúpido, pero bloquea tu aplicación a la orientación deseada. ¡Luego sigue preguntando al girómetro qué orientación tiene el dispositivo para rotar o animar tus vistas a la nueva orientación, pero no por ello menos importante!
Editar: es posible que desee ocultar el sistema ui, ya que no girará. Mario
Esta es la forma en que la aplicación de cámara de valores inhabilita la animación de rotación:
private void setRotationAnimation() {
int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
winParams.rotationAnimation = rotationAnimation;
win.setAttributes(winParams);
}
Nota: de acuerdo con la Referencia de API y el comentario a continuación, esto solo funciona:
- En API nivel 18 o superior
- El indicador
FLAG_FULLSCREEN
está configurado paraWindowManager.LayoutParams
de la actividad - La actividad no está cubierta por otra ventana (por ejemplo, la ventana emergente de apagado que se desencadena pulsando prolongadamente el botón de encendido)
Lo puse en la actividad principal y canceló la animación de rotación:
@Override
public void setRequestedOrientation(int requestedOrientation) {
super.setRequestedOrientation(requestedOrientation);
int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
winParams.rotationAnimation = rotationAnimation;
win.setAttributes(winParams);
}
Más detalles aquí .
Lo siento, no hay forma de controlar la animación de rotación. Esto se hace fuera de su aplicación, en el administrador de ventanas donde toma una captura de pantalla de la pantalla actual, cambia el tamaño y reconstruye la interfaz de usuario detrás de ella, y luego ejecuta una animación incorporada para pasar de la captura de pantalla original a la nueva reconstruida UI. No hay forma de modificar este comportamiento cuando cambia la rotación de la pantalla.
Puede configurar en AndroidManifest una propiedad llamada android:configChanges
donde puede decidir qué cambios desea administrar en el código. De esta forma, la animación de cambio de rotación se desactivará y podrá manejarla como lo desee en el método onConfigurationChanged
de su Activity
.
<activity
android:name=".MySuperClass"
android:label="@string/read_qrcode"
android:screenOrientation="portrait"
android:configChanges="orientation" />
Puede que ya hayas intentado esto, pero por las dudas:
Intenta definir una animación de "no hacer nada" y llama a overridePendingTransition()
con su id. Tal vez algo así como:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:duration="100" />
</set>
Lo siento, no tenía un dispositivo Galaxy para probar :)
Si desea establecer sus actividades en modo vertical solo puede hacerlo en su archivo de manifiesto como este
<activity
android:name=".Qosko4Activity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>