Animuj niestandardowe okno dialogowe

97

Próbuję wyświetlić niestandardowe okno dialogowe tak, jakby zsuwało się z widoku tekstu. czy to możliwe? Nie mogę zastosować żadnej animacji do klasy dialogowej. Wypróbowałem tę linię w konstruktorze, ale to nie daje efektu:

this.getWindow (). setWindowAnimations (R.anim.paranimation);

Nie jestem nawet pewien, czy animacja jest poprawna, ale będę w stanie ją dostosować, gdy zobaczę, co robi. Dla kompletności podam to poniżej. Nie szukam pomocy przy samej animacji, tylko aplikacja do okna dialogowego.

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
źródło
4
Też muszę to wiedzieć. Poza tym wydaje się, że można ożywić prawie wszystko. A może się mylę ?!
andy_spoo

Odpowiedzi:

215

Zmagałem się dzisiaj z animacją Dialog, w końcu udało mi się ją uruchomić przy użyciu stylów, więc oto przykład.

Na początek najważniejsza rzecz - prawdopodobnie miałem to dzisiaj działające na 5 różnych sposobów, ale nie mogłem powiedzieć, ponieważ ... Jeśli ustawienia animacji twojego urządzenia są ustawione na "Brak animacji" (Ustawienia → Wyświetlacz → Animacja), wtedy okna dialogowe wygrały nie bądź animowany bez względu na to, co robisz!

Poniżej znajduje się uproszczona wersja pliku my styles.xml. Mam nadzieję, że jest to oczywiste. Powinien znajdować się w 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>

Jest windowEnterAnimationto jedna z moich animacji i znajduje się w res\anim. Jest windowExitAnimationto jedna z animacji, która jest częścią zestawu Android SDK.

Następnie, kiedy tworzę okno dialogowe w onCreateDialog(int id)metodzie moich działań , wykonuję następujące czynności.

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

Alternatywnie możesz ustawić animacje w następujący sposób, zamiast używać konstruktora Dialog, który pobiera motyw.

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;
ChrisJD
źródło
2
To była tylko nazwa, którą wymyśliłem na potrzeby tego przykładu, nigdy nie stworzyłem tej animacji.
ChrisJD,
2
Bardzo dziękuję za tę odpowiedź, jest naprawdę słabo udokumentowana, chociaż znalazłem ten post dzięki wskazówce od grupy programistów Androida .
David Snabel-Caunt
3
+1 W przypadku opcji „Jeśli ustawienia animacji urządzeń są ustawione na„ Brak animacji ”(Ustawienia → Wyświetlacz → Animacja), okna dialogowe nie będą animowane bez względu na to, co robisz!”. Zapomniałem to sprawdzić.
Vincent Mimoun-Prat
Dialog dialog = new Dialog(this, R.style.PauseDialog);to jest dla API 11, ale to jest ogólneDialog dialog = new Dialog(Context context);
mehmet
2
Problem, z którym mam do czynienia, polega na tym, że kiedy minimalizuję aplikację, gdy okno dialogowe jest wyświetlane, i ponownie ją przywracam, okno dialogowe ponownie się ożywia, jak tego uniknąć, odpocznij idealnie. +1
Parth Anjaria
56

Stworzyłem animację pojawiania się i zanikania dla Dialogbox przy użyciu kodu ChrisJD.

  1. Wewnątrz 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. Wewnątrz 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. Wewnątrz 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. Główna aktywność

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);
Akshay Taru
źródło
11
Możesz użyć domyślnych animacji zanikania Androida '@android: anim / fade_in' @android: anim / fade_out '
Marek
19

Od prawej do lewej (animacja wejścia) i od lewej do prawej (animacja wyjścia):

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>

Utwórz dwa pliki w 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%"/>

W Tobie Fragment / Aktywność:

Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);
vasanth
źródło
13

Napotykam ten sam problem, ale w końcu rozwiązuję go w następujący sposób

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));
youshuang
źródło
4
Niezbyt rozsądna odpowiedź. Widoki w oknie dialogowym zostaną ożywione
DJphy
12

Najpierw musisz stworzyć dwa zasoby animacji w katalogu 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>

wtedy musisz stworzyć styl

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_bottom</item>
</style>

i dodaj tę linię do swojej klasy

dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id

Na podstawie http://www.devexchanges.info/2015/10/showing-dialog-with-animation-in-android.html

Argel Ortiz Arenas
źródło
referencyjny adres URL jest przydatny!
ahmednabil88
2

Wypróbuj poniższy kod:

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;

    }

Utwórz animację niestandardową .: 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>
amiron
źródło