Отключить анимацию по умолчанию от Портрет до Пейзаж
У меня есть приложение с несколькими "обычными" действиями, которые могут работать как в альбомной, так и в портретной ориентации. Они предназначены для и в основном используются на портрете.
Это приложение имеет одно единственное действие, которое использует камеру и заблокировано на ландшафте. Я "симулирую" это упражнение на портрете, поворачивая изображения и тексты на 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); удалены нормальные переходы (портрет-> портрет и пейзаж-> пейзаж), но не была удалена анимация вращения (портрет-> пейзаж и наоборот).
[ВИДЕО]
Я загрузил видео, которое показывает анимацию, которую я хочу отключить. Это происходит при переходе от режима работы камеры (заблокирован к горизонтальной ориентации) к другому режиму при удерживании телефона на портрете:
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" в свой тег активности.
Против тех, кто сказал нет, я говорю да, это возможно, и это очень просто! Первое, что может показаться глупым, но заблокировать приложение в желаемой ориентации! Затем продолжайте спрашивать гирометр, какую ориентацию имеет последнее устройство, но не в последнюю очередь поворачивайте или оживляйте ваши взгляды в новой ориентации!
Изменить: вы можете скрыть системный интерфейс, так как он не будет вращаться. Марио