Анимировать настраиваемый диалог

98

Я пытаюсь создать настраиваемый диалог, как будто он скользит вниз из текстового представления. Это возможно? Кажется, я не могу применить анимацию к классу диалога. Я пробовал эту строку в конструкторе, но она не действует:

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>
FMLDev
источник
4
Мне тоже нужно это знать. Кажется возможным оживить что угодно, кроме этого. Или я не прав ?!
andy_spoo 02

Ответы:

216

Сегодня я боролся с анимацией диалогов, наконец, заставил ее работать с использованием стилей, поэтому вот пример.

Для начала, самое главное - у меня, вероятно, сегодня он работал 5 разными способами, но я не мог сказать, потому что ... Если в настройках анимации вашего устройства установлено значение «Без анимации» (Настройки → Дисплей → Анимация), тогда диалоги выиграли Не будьте анимированы, что бы вы ни делали!

Ниже приводится урезанная версия моего файла 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 dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;
ChrisJD
источник
2
Это было просто название, которое я придумал для этого примера, я никогда не создавал эту анимацию.
ChrisJD
2
Большое спасибо за этот ответ, он действительно плохо документирован, хотя я нашел этот пост по подсказке от группы разработчиков Android .
Дэвид Снабел-Коунт
3
+1 Для «Если в настройках анимации вашего устройства установлено значение« Без анимации »(Настройки → Дисплей → Анимация), то диалоги не будут анимированы, что бы вы ни делали!». Я забыл это проверить.
Винсент Мимун-Прат,
Dialog dialog = new Dialog(this, R.style.PauseDialog);это для API 11, но это общееDialog dialog = new Dialog(Context context);
мехмет
2
Проблема, с которой я сталкиваюсь, заключается в том, что когда я сворачиваю приложение, когда отображается диалоговое окно, и снова восстанавливаю приложение, диалоговое окно снова анимируется, как этого избежать, оставайтесь безупречными. +1
Парт Анджария
57

Я создал анимацию Fade in и Fade Out для Dialogbox, используя код ChrisJD.

  1. Внутри 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>

  2. Внутри 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" />
  3. Внутри anim / fadeout.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" />
  4. Основное занятие

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);
Акшай Тару
источник
11
Вы можете использовать анимацию затухания для Android по умолчанию '@android: anim / fade_in' @android: anim / fade_out '
Марек
20

Для справа налево (анимация входа) и слева направо (анимация выхода):

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);
васант
источник
13

У меня та же проблема, но, наконец, я решаю ее следующим образом

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));
Youshuang
источник
4
Не разумный ответ. Взгляды внутри диалогов становятся анимированными
DJphy
13

Во-первых, вам нужно создать два ресурса анимации в каталоге 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>
</set>

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

тогда вам нужно создать стиль

<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

На основе http://www.devexchanges.info/2015/10/showing-dialog-with-animation-in-android.html

Аргел Ортис Аренас
источник
ссылочный URL полезен!
ahmednabil88
2

Попробуйте код ниже:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// set transparent in window background

        View _v = inflater.inflate(R.layout.some_you_layout, container, false);

        //load animation
        //Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);// system animation appearance
        Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), R.anim.customer_anim);//customer animation appearance

        _v.setAnimation( transition_in_view );
        _v.startAnimation( transition_in_view );
        //really beautiful
        return _v;

    }

Создайте собственный Anim .: res / anim / customer_anim.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="-7%"/>
    <translate
        android:duration="300"
        android:startOffset="500"
        android:toYDelta="7%" />
    <translate
        android:duration="200"
        android:startOffset="800"
        android:toYDelta="0%" />

</set>
амирон
источник