Animieren Sie einen benutzerdefinierten Dialog

97

Ich versuche, ein benutzerdefiniertes Dialogfeld so anzuzeigen, als würde es aus einer Textansicht nach unten verschoben. Ist das möglich? Ich kann anscheinend keine Animation auf die Dialogklasse anwenden. Ich habe diese Zeile im Konstruktor ausprobiert, aber sie hat keine Auswirkung:

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

Ich bin mir nicht einmal sicher, ob die Animation korrekt ist, aber ich kann sie anpassen, sobald ich sehe, was sie tut. Ich werde es der Vollständigkeit halber unten auflisten. Ich suche keine Hilfe für die eigentliche Animation, sondern nur die Anwendung für den Dialog.

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
quelle
4
Das muss ich auch wissen. Abgesehen davon scheint es möglich zu sein, fast alles zu animieren. Oder liege ich falsch?!
andy_spoo

Antworten:

214

Ich habe heute mit Dialoganimationen zu kämpfen gehabt und sie endlich mit Stilen zum Laufen gebracht. Hier ist ein Beispiel.

Zunächst das Wichtigste - ich hatte es heute wahrscheinlich auf 5 verschiedene Arten funktionieren lassen, konnte es aber nicht sagen, weil ... Wenn die Animationseinstellungen Ihres Geräts auf "Keine Animationen" (Einstellungen → Anzeige → Animation) eingestellt sind, haben die Dialoge gewonnen Sei nicht animiert, egal was du tust!

Das Folgende ist eine abgespeckte Version meiner styles.xml. Hoffentlich ist es selbsterklärend. Dies sollte sich in befinden 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>

Das windowEnterAnimationist eine meiner Animationen und befindet sich in res\anim. Dies windowExitAnimationist eine der Animationen, die Teil des Android SDK ist.

Wenn ich dann den Dialog in meiner Aktivitätsmethode erstelle, onCreateDialog(int id)gehe ich wie folgt vor.

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

Alternativ können Sie die Animationen folgendermaßen festlegen, anstatt den Dialogkonstruktor zu verwenden, der ein Thema verwendet.

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;
ChrisJD
quelle
2
Das war nur ein Name, den ich für dieses Beispiel erfunden habe. Ich habe diese Animation nie erstellt.
ChrisJD
2
Vielen Dank für diese Antwort, sie ist wirklich schlecht dokumentiert, obwohl ich diesen Beitrag über einen Hinweis der Android-Entwicklergruppe gefunden habe .
David Snabel-Caunt
3
+1 Für "Wenn die Animationseinstellungen Ihres Geräts auf" Keine Animationen "(Einstellungen → Anzeige → Animation) eingestellt sind, werden die Dialoge nicht animiert, egal was Sie tun!". Ich hatte vergessen, das zu überprüfen.
Vincent Mimoun-Prat
Dialog dialog = new Dialog(this, R.style.PauseDialog);es ist für API 11, aber dies ist allgemeinDialog dialog = new Dialog(Context context);
mehmet
2
Das Problem, mit dem ich konfrontiert bin, ist, dass, wenn ich die App minimiere, wenn der Dialog angezeigt wird, und die App erneut wiederherstelle, der Dialog erneut animiert wird, wie dies vermieden werden kann, und dass er perfekt ist. +1
Parth Anjaria
56

Ich habe die Animation zum Ein- und Ausblenden für das Dialogfeld mit ChrisJD-Code erstellt.

  1. In 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. In 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. In 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. Hauptaktivität

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);
Akshay Taru
quelle
11
Sie können Standard-Android-Fade-Animationen '@android: anim / fade_in' '@android: anim / fade_out'
Marek
19

Für von rechts nach links (Eingangsanimation) und von links nach rechts (Ausgangsanimation):

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>

Erstellen Sie zwei Dateien in 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%"/>

In dir Fragment / Aktivität:

Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);
Vasanth
quelle
13

Ich treffe das gleiche Problem, aber schließlich löse ich das Problem auf folgende Weise

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));
Youshuang
quelle
4
Keine vernünftige Antwort. Die Ansichten innerhalb des Dialogs werden animiert
DJphy
12

Zuerst müssen Sie zwei Animationsressourcen in res / anim dir erstellen

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>

dann musst du einen Stil erstellen

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

und fügen Sie diese Zeile Ihrer Klasse hinzu

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

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

Argel Ortiz Arenen
quelle
Referenz-URL ist nützlich!
Ahmednabil88
2

Versuchen Sie den folgenden Code:

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;

    }

Erstellen Sie die benutzerdefinierte Animation: 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
quelle