Отключить анимацию по умолчанию от Portrait to Landscape
У меня есть приложение с несколькими "нормальными" действиями, которые могут работать как по ландшафту, так и по портрету. Они предназначены для и в основном используются на портрете.
В этом приложении есть одно действие, которое использует камеру и заблокировано на фоне. Я "имитирую" эту деятельность на портрете, поворачивая изображения и тексты на 90 градусов, поэтому он выглядит как остальные действия.
На некоторых устройствах, таких как Samsung Galaxy Tab 7 и Galaxy S3, анимация вращения отображается при переходе от обычной портретной активности к активности пейзажа камеры и назад. Это запутывает пользователя, потому что ландшафтная активность имитируется на портрете.
Есть ли способ удалить эту анимацию вращения? В идеале я бы хотел изменить портретную анимацию по умолчанию, но просто удалить анимацию вращения было бы достаточно.
Я пробовал
overridePendingTransition(0, 0);
другие варианты этого метода без успеха.
[ADDED]
Следуя советам @igalarzab, @Georg и @Joe, я сделал это (все еще не повезло):
- Добавлен андроид: configChanges = "orientation | screenSize" для манифеста
- Добавлено onConfigurationChanged
- Создал фиктивную анимацию, которая ничего не делает и добавила overridePendingTransition (R.anim.nothing, R.anim.nothing);
У меня были следующие результаты:
- onConfigurationChanged вызывается только при вращении одной и той же активности (активность A на портрете → активность A на ландшафте). Но он не вызывается при переходе из Activity A на портрете → Activity 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
Ответы
Ответ 1
Извините, нет возможности управлять анимацией вращения. Это делается вне вашего приложения, в глубине оконного менеджера, где требуется скриншот текущего экрана, изменяет размер и перестраивает интерфейс пользователя за ним, а затем запускает встроенную анимацию для перехода от исходного скриншота к новому перестроенному UI. Невозможно изменить это поведение при изменении поворота экрана.
Ответ 2
Это способ, которым приложение камеры для камеры отключает анимацию вращения:
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 и комментарий ниже, это работает только:
- На уровне API 18 или выше
- Флаг
FLAG_FULLSCREEN
установлен для WindowManager.LayoutParams
Activity
- Активность не распространяется на другое окно (например, всплывающее окно Power Off, вызванное длительным нажатием кнопки питания)
Ответ 3
Вы можете установить в AndroidManifest свойство с именем android:configChanges
, где вы можете решить, какие изменения вы хотите управлять в коде. Таким образом, анимация смены поворота будет отключена, и вы сможете обрабатывать ее, как вы хотите, в методе onConfigurationChanged
вашего Activity
.
<activity
android:name=".MySuperClass"
android:label="@string/read_qrcode"
android:screenOrientation="portrait"
android:configChanges="orientation" />
Ответ 4
Я поместил это в 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);
}
Подробнее здесь.
Ответ 5
Возможно, вы уже пробовали это, но на всякий случай:
Попробуйте определить анимацию "ничего не делать" и вызовите 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 для тестирования:)
Ответ 6
Если вы хотите настроить свои действия в портретном режиме, вы можете сделать это в вашем файле манифеста, как это показано
<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>
Ответ 7
Вы можете установить в AndroidManifest свойство, называемое android: configChanges, где вы можете решить, какие изменения вы хотите управлять в коде. Таким образом, анимация изменения поворота будет отключено, и вы можете обрабатывать его так, как хотите в методе onConfigurationChanged вашей деятельности.
Это должно работать, но согласно этой странице вы также должны добавить screenSize в configChanges, добавив android: configChanges = "orientation | screenSize" в ваш тег активности.
Ответ 8
Против них, которые сказали "нет", я говорю "да", это возможно, и это очень просто! Первое, что может показаться глупым, но заблокировать ваше приложение к желаемой ориентации! Затем продолжайте задавать гирометру, какая ориентация устройства имеет последнее, но не менее важное значение: поворачивать или анимировать ваши взгляды на новую ориентацию!
Изменить: вы можете скрыть систему ui, так как она не будет вращаться.
Марио