Отключить анимацию по умолчанию от Портрет до Пейзаж

У меня есть приложение с несколькими "обычными" действиями, которые могут работать как в альбомной, так и в портретной ориентации. Они предназначены для и в основном используются на портрете.

Это приложение имеет одно единственное действие, которое использует камеру и заблокировано на ландшафте. Я "симулирую" это упражнение на портрете, поворачивая изображения и тексты на 90 градусов, так что это похоже на остальные занятия.

На некоторых устройствах, таких как Samsung Galaxy Tab 7 и Galaxy S3, анимация вращения отображается при переходе от обычной портретной активности к пейзажной активности камеры и обратно. Это сбивает с толку пользователя, потому что ландшафтная деятельность симулирует нахождение на портрете.

Есть ли способ удалить эту анимацию вращения? В идеале я хотел бы изменить портрет по умолчанию на портретную анимацию, но достаточно просто удалить анимацию вращения.

я пробовал

overridePendingTransition(0, 0);

другие варианты этого метода без успеха.

[Добавлено]

Следуя предложениям @igalarzab, @Georg и @Joe, я сделал это (все еще безуспешно):

  • Добавлен android:configChanges="direction|screenSize" для манифеста
  • Добавлено на Конфигурация Изменено
  • Создана фиктивная анимация, которая ничего не делает и добавила overridePendingTransition(R.anim.nothing, R.anim.nothing);

У меня были такие результаты:

  • onConfigurationChanged вызывается только при вращении одного и того же действия (действие A на портрете -> действие A на ландшафте). Но это не вызывается при переходе от Действия A на портрете -> Деятельность B на ландшафте
  • Это препятствовало перезапуску Activity при вращении, но НЕ удаляло анимацию вращения (проверено на Galaxy S3, Galaxy Nexus, Galaxy Tab 7.0 и Galaxy Tab 10.1)
  • overridePendingTransition(R.anim.nothing, R.anim.nothing); удалены нормальные переходы (портрет-> портрет и пейзаж-> пейзаж), но не была удалена анимация вращения (портрет-> пейзаж и наоборот).

[ВИДЕО]

Я загрузил видео, которое показывает анимацию, которую я хочу отключить. Это происходит при переходе от режима работы камеры (заблокирован к горизонтальной ориентации) к другому режиму при удерживании телефона на портрете:

http://youtu.be/T79Q1P_5_Ck

10 ответов

Решение

Извините, что нет способа управлять анимацией вращения. Это делается далеко за пределами вашего приложения, глубоко в диспетчере окон, где он делает снимок экрана текущего экрана, изменяет размеры и перестраивает пользовательский интерфейс за ним, а затем запускает встроенную анимацию для перехода от исходного снимка экрана к новому восстановленному UI. Нет способа изменить это поведение при изменении поворота экрана.

Вот как приложение "Стандартная камера" отключает анимацию вращения:

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

Примечание. Согласно API Reference и комментариям ниже, это работает только:

  • На уровне API 18 или выше
  • FLAG_FULLSCREEN флаг установлен для WindowManager.LayoutParams деятельности
  • Упражнение не закрывается другим окном (например, всплывающее окно "Выключение питания", вызванное длительным нажатием кнопки питания)
      android:rotationAnimation="seamless"

добавление этого атрибута в активность уменьшит анимацию при вращении. Я пытаюсь найти его, когда хочу сделать плавное приложение для камеры.

Вы можете установить в AndroidManifest свойство с именем android:configChanges где вы можете решить, какими изменениями вы хотите управлять в коде. Таким образом, анимация изменения поворота будет отключена, и вы можете обрабатывать ее так, как хотите в методе. onConfigurationChanged вашей Activity,

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

Я поместил это в mainActivity, и он отменил анимацию вращения:

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

    }

Подробнее здесь.

Возможно, вы уже попробовали это, но на всякий случай:

Попробуйте определить анимацию "ничего не делать" и вызвать overridePendingTransition() со своим идентификатором. Может быть что-то вроде:

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

Извините, у меня не было устройства Galaxy для тестирования:)

Если вы хотите установить свои действия только в портретном режиме, вы можете сделать это в своем файле манифеста следующим образом

 <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>

Успешно проверено: Java - Android 9 (Pie) - Android Studio 4.1.3 - Huawei P10

Полгода я не мог решить эту задачу. Проблема заключалась в неназначенном флаге «FLAG_FULLSCREEN» в коде.

Первый шаг MainActivity.java:

      public class MainActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRotationAnimation(); 
  }

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

  public void Button (View view) {
    // Connected to android:onClick="Button" in XML.
    Intent intent = new Intent(MainActivity.this, MainActivity2.class);
    startActivity(intent);
  }
}

Следующий шаг MainActivity2.java:

      public class MainActivity2 {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRotationAnimation(); 
  }

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

  public void Button (View view) {
    Intent intent = new Intent(MainActivity2.this, MainActivity.class);
    startActivity(intent);
  }
}

Следующий шаг styles.xml:

      <resources>
  <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
      <item name="android:windowFullscreen">true</item>
  </style>
</resources>

Я понял простые вещи: мы должны назначить FLAG_FULLSCREEN для onCreate. Вы должны сначала запустить "setRotationAnimation()", прежде чем запускать activity2. При запуске activity2 вы должны запустить в нем "setRotationAnimation()". Работает некорректно.

Вы можете установить в AndroidManifest свойство с именем android:configChanges, где вы можете решить, какими изменениями вы хотите управлять в коде. Таким образом, анимация изменения поворота будет отключена, и вы можете обрабатывать ее, как хотите, в методе onConfigurationChanged вашей Activity.

Это должно работать, но в соответствии с этой страницей вы должны также добавить screenSize в configChanges, добавив android:configChanges="direction|screenSize" в свой тег активности.

Против тех, кто сказал нет, я говорю да, это возможно, и это очень просто! Первое, что может показаться глупым, но заблокировать приложение в желаемой ориентации! Затем продолжайте спрашивать гирометр, какую ориентацию имеет последнее устройство, но не в последнюю очередь поворачивайте или оживляйте ваши взгляды в новой ориентации!

Изменить: вы можете скрыть системный интерфейс, так как он не будет вращаться. Марио

Другие вопросы по тегам