web-dev-qa-db-fra.com

Désactiver l'animation par défaut du portrait au paysage

J'ai une application avec plusieurs activités "normales" pouvant courir sur le paysage ou le portrait. Ils sont conçus pour et surtout utilisés sur le portrait.

Cette application dispose d'une seule activité qui utilise la caméra et est verrouillée sur le paysage. Je "simuler" cette activité est sur le portrait en faisant pivoter des images et des textes à 90 degrés, il ressemble donc au reste des activités.

Sur certains périphériques, tels que Samsung Galaxy Tab 7 et Galaxy S3, une animation de rotation est affichée lorsqu'il passe d'une activité de portrait normale à l'activité de paysage de la caméra et à l'arrière . Ceci est déroutant pour l'utilisateur car l'activité paysagère simule être sur portrait.

Existe-t-il un moyen de supprimer cette animation de rotation ? Idéalement, j'aimerais changer de portrait par défaut à l'animation des portraits, mais il suffirait d'éliminer la rotation d'animation.

J'ai essayé

overridePendingTransition(0, 0);

une autre variation de cette méthode sans succès.

[AJOUTÉE]

Suivant les suggestions de @igalarzab, @georg et @joe, je l'ai fait (toujours sans chance):

  • Ajouté Android: configchange = "Orientation | Screencissez" pour manifester
  • Ajouté OnconfigurationCommé
  • Créé une animation factice qui ne fait rien et ajout de la dépendance de dépendance (R.Anim.nothing, R.Anim.nothing);

J'ai eu ces résultats:

  • onconfigurationBanged n'est appelé que lors de la rotation de la même activité (activité A sur portrait -> activité A sur paysage). Mais cela n'est pas appelé en passant d'activité A sur portrait -> Activité B sur paysage
  • Cette activité empêchait d'être redémarré lors de la rotation, mais elle n'a pas supprimé d'animation de rotation (testée sur Galaxy S3, Galaxy Nexus, Galaxy Tab 7.0 et Galaxy Tab 10.1)
  • remplacer l'étage de l'alimentation (r.anim.nothing, r.anim.nothing); Transitions normales supprimées (portrait> portrait et paysage -> paysage) mais il n'a pas supprimé d'animation de rotation (portrait-> paysage et inversement).

[VIDÉO]

J'ai téléchargé une vidéo qui montre une animation que je veux désactiver. Cela se produit lorsque vous changez d'activité de caméra (verrouillée au paysage) vers une autre activité tout en maintenant téléphone sur portrait:

http://youtu.be/t79q1p_5_ck

42
Jorge Cevallos

C'est la façon dont l'application de la caméra stock désactive l'animation de rotation:

private void setRotationAnimation() {
    int rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    winParams.rotationAnimation = rotationAnimation;
    win.setAttributes(winParams);
}

Remarque: selon Référence API et commentaire ci-dessous, cela ne fonctionne que:

  • Au niveau de l'API 18 ou plus
  • Les FLAG_FULLSCREEN le drapeau est défini pour WindowManager.LayoutParams de l'activité
  • L'activité n'est pas couverte par une autre fenêtre (par exemple, la fenêtre contextuelle hors tension déclenchée par une pression longue en appuyant sur le bouton d'alimentation)
21
martinpelant

Vous pouvez installer dans l'androidmanifest une propriété appelée Android:configChanges Où vous pouvez décider quels changements vous souhaitez gérer dans le code. De cette manière, l'animation de changement de rotation sera désactivée et vous pouvez le gérer comme vous le souhaitez dans la méthode onConfigurationChanged de votre Activity.

<activity
    Android:name=".MySuperClass"
    Android:label="@string/read_qrcode"
    Android:screenOrientation="portrait"
    Android:configChanges="orientation" />
2
igalarzab

J'ai mis cela dans la principale et elle a annulé l'animation de rotation:

@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);

    }

Plus de détails ici .

1
M. Sherbeeny

Vous auriez peut-être déjà essayé cela, mais juste au cas où:

Essayez de définir une animation "Ne rien faire" et appelez overridePendingTransition() avec son identifiant. Peut-être quelque chose comme:

    <set xmlns:Android="http://schemas.Android.com/apk/res/Android" 
         Android:fillAfter="true">
        <translate
            Android:fromXDelta="0"
            Android:toXDelta="0"
            Android:duration="100" />
    </set>

Désolé, je n'ai pas eu de dispositif de galaxie à tester avec :)

0
Joe