Анімація користувальницького діалогу


97

Я намагаюся, щоб спеціальний діалог з'явився так, ніби він ковзає вниз з тексту. Чи можливо це? Я не можу застосувати жодну анімацію до діалогового класу. Я спробував цю лінію в конструкторі, але це не має ефекту:

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>

4
Мені потрібно це також знати. Здається, анімувати практично все, крім цього. Або я помиляюся ?!
andy_spoo

Відповіді:


215

Я сьогодні боровся з анімацією Dialog, нарешті змусив її працювати за допомогою стилів, ось ось приклад.

Для початку найважливіше - я, мабуть, працював 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;

2
Це було лише ім'я, яке я склав для цього прикладу, я ніколи насправді не створював цієї анімації.
ChrisJD

2
Дякую за цю відповідь, це дуже погано задокументовано, хоча я знайшов цю публікацію через підказку з групи розробників Android .
David Snabel-Caunt

3
+1 Для параметра "Якщо для налаштувань анімації ваших пристроїв встановлено значення" Без анімації "(Налаштування → Дисплей → Анімація), діалогові вікна не будуть анімовані, незалежно від того, що ви робите!". Я забув це перевірити.
Вінсент Мімон-Прат

Dialog dialog = new Dialog(this, R.style.PauseDialog);це для API 11, але це загальнеDialog dialog = new Dialog(Context context);
мехмет

2
Проблема, з якою я стикаюся, полягає в тому, що, коли я мінімізую додаток, коли з'являється діалогове вікно, і знову відновити додаток, діалогове вікно знову оживляє, як цього уникнути, будьте його ідеальними. +1
Parth Anjaria

56

Я створив анімацію 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. MainActivity

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);

11
Ви можете використовувати анімацію для зникнення Android за замовчуванням '@android: anim / fade_in' '@android: anim / fade_out'
Marek

19

Справа наліво (анімація при введенні) та зліва направо (анімація виходу):

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

4
Не розумна відповідь. Погляди в діалоговому вікні оживляються
DJphy

12

По-перше, ви повинні створити два ресурси анімації в res / anim dir

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.