Анимировать настраиваемый диалог
Я пытаюсь создать настраиваемое диалоговое окно, как будто оно сползает с текстового вида. Это возможно? Я не могу применить анимацию к классу диалога. Я пробовал эту строку в конструкторе, но не имеет никакого эффекта:
this.getWindow() setWindowAnimations (R.anim.paranimation);.
Я даже не уверен, что анимация правильная, но я смогу ее отрегулировать, как только увижу, что она делает. Я перечислил его ниже ради полноты. Я не ищу помощь в реальной анимации, просто приложение в диалоговом окне.
paranimation.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-200%"
android:toXDelta="0%"
android:fromYDelta="200%"
android:toYDelta="0%"
android:duration="3000"
android:zAdjustment="top">
</translate>
Ответы
Ответ 1
Я сегодня борюсь с анимацией Dialog, наконец, начал работать с использованием стилей, вот пример.
Начнем с того, что самое главное - я, вероятно, сегодня работал по-разному, но не мог сказать, потому что... Если в настройках анимации вашего устройства установлено значение "Без анимации" (Настройки → Экран → Анимация), тогда диалоги не будут анимированы независимо от того, что вы делаете!
Ниже приведена урезанная версия моего styles.xml. Надеюсь, это самоочевидно. Это должно быть расположено в res/values
.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="PauseDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
</style>
<style name="PauseDialogAnimation">
<item name="android:windowEnterAnimation">@anim/spin_in</item>
<item name="android:windowExitAnimation">@android:anim/slide_out_right</item>
</style>
</resources>
windowEnterAnimation
является одной из моих анимаций и находится в res\anim
.
windowExitAnimation
- одна из анимаций, которые являются частью Android SDK.
Затем, когда я создаю диалог в моей деятельности onCreateDialog(int id)
, я делаю следующее.
Dialog dialog = new Dialog(this, R.style.PauseDialog);
// Setting the title and layout for the dialog
dialog.setTitle(R.string.pause_menu_label);
dialog.setContentView(R.layout.pause_menu);
В качестве альтернативы вы можете настроить анимацию следующим образом, вместо использования конструктора диалога, который принимает тему.
Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;
Ответ 2
Я создал анимацию Fade in и Fade Out для Dialogbox с использованием кода ChrisJD.
-
Внутри res/style.xml
<style name="AppTheme" parent="android:Theme.Light" />
<style name="PauseDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
</style>
<style name="PauseDialogAnimation">
<item name="android:windowEnterAnimation">@anim/fadein</item>
<item name="android:windowExitAnimation">@anim/fadeout</item>
</style>
-
Внутри anim/fadein.xml
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />
-
Внутри anim/fadeut.xml
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/anticipate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />
-
MainActivity
Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);
Ответ 3
Для справа налево (анимация ввода) и слева направо (выход анимации):
styles.xml:
<style name="CustomDialog" parent="@android:style/Theme.Dialog">
<item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>
<style name="CustomDialogAnimation">
<item name="android:windowEnterAnimation">@anim/translate_left_side</item>
<item name="android:windowExitAnimation">@anim/translate_right_side</item>
</style>
Создайте два файла в res/anim/:
translate_right_side.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0%" android:toXDelta="100%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="600"/>
translate_left_side.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600"
android:fromXDelta="100%"
android:toXDelta="0%"/>
В разделе "Фрагмент/Активность":
Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);
Ответ 4
Я встречаюсь с той же проблемой, но, наконец, я решу проблему следующим образом
((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));
Ответ 5
Сначала вы должны создать два ресурса анимации в res/anim
slide_up.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromydelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:toxdelta="0">
</translate>
slide_bottom.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromydelta="0%p"
android:interpolator="@android:anim/accelerate_interpolator"
android:toydelta="100%p">
</translate>
тогда вы должны создать стиль
<style name="DialogAnimation">
<item name="android:windowEnterAnimation">@anim/slide_up</item>
<item name="android:windowExitAnimation">@anim/slide_bottom</item>
</style>
и добавьте эту строку в свой класс
dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id