Anima una finestra di dialogo personalizzata


97

Sto cercando di visualizzare una finestra di dialogo personalizzata come se stesse scorrendo verso il basso da una visualizzazione di testo. È possibile? Non riesco ad applicare alcuna animazione alla classe di dialogo. Ho provato questa riga nel costruttore, ma non ha alcun effetto:

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

Non sono nemmeno sicuro che l'animazione sia corretta, ma potrò regolarla una volta che vedrò cosa sta facendo. Lo elencherò di seguito per completezza. Non cerco aiuto sull'animazione effettiva, ma solo sull'applicazione alla finestra di dialogo.

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
Ho bisogno di sapere anche questo. Sembra possibile animare qualsiasi cosa, a parte questo. O mi sbaglio?!
andy_spoo

Risposte:


215

Oggi ho lottato con l'animazione dei dialoghi, finalmente ho funzionato usando gli stili, quindi ecco un esempio.

Per cominciare, la cosa più importante: probabilmente funzionava in 5 modi diversi oggi ma non potevo dirlo perché ... Se le impostazioni di animazione del tuo dispositivo sono impostate su "Nessuna animazione" (Impostazioni → Display → Animazione), allora le finestre di dialogo hanno vinto essere animato qualunque cosa tu faccia!

Quella che segue è una versione ridotta del mio styles.xml. Si spera che sia autoesplicativo. Dovrebbe trovarsi in 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>

La windowEnterAnimationè una delle mie animazioni e si trova in res\anim. La windowExitAnimationè una delle animazioni che fa parte del SDK di Android.

Quindi, quando creo il dialogo nel onCreateDialog(int id)metodo delle mie attività , faccio quanto segue.

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

In alternativa è possibile impostare le animazioni nel modo seguente invece di utilizzare il costruttore Dialog che accetta un tema.

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;

2
Era solo un nome che ho inventato per questo esempio, non ho mai creato quell'animazione.
ChrisJD

2
Grazie mille per questa risposta, è davvero scarsamente documentata, anche se ho trovato questo post tramite un indizio del gruppo di sviluppatori Android .
David Snabel-Caunt

3
+1 Per "Se le impostazioni di animazione del dispositivo sono impostate su" Nessuna animazione "(Impostazioni → Schermo → Animazione), le finestre di dialogo non saranno animate, qualunque cosa tu faccia!". Mi ero dimenticato di controllarlo.
Vincent Mimoun-Prat

Dialog dialog = new Dialog(this, R.style.PauseDialog);è per API 11 ma questo è generaleDialog dialog = new Dialog(Context context);
mehmet

2
Il problema che sto affrontando in questo è che quando riduco a icona l'app quando viene visualizzata la finestra di dialogo e ripristino nuovamente l'app, la finestra di dialogo si anima di nuovo, come evitarlo, resta perfetto. +1
Parth Anjaria

56

Ho creato l'animazione Fade in e Fade Out per Dialogbox utilizzando il codice ChrisJD.

  1. All'interno di 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. All'interno di 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. All'interno di 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. Attività principale

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

11
Puoi usare le animazioni di dissolvenza Android predefinite '@android: anim / fade_in' '@android: anim / fade_out'
Marek

19

Da destra a sinistra (animazione di ingresso) e da sinistra a destra (animazione di uscita):

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>

Crea due file 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 te frammento / attività:

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

13

Incontro lo stesso problema, ma alla fine risolvo il problema in modo seguito

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));

4
Non una risposta sensata. Le visualizzazioni all'interno della finestra di dialogo si animano
DJphy

12

Innanzitutto, devi creare due risorse di animazione nella directory 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>

quindi devi creare uno stile

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

e aggiungi questa riga alla tua classe

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

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


l'URL di riferimento è utile!
ahmednabil88

2

Prova il codice seguente:

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;

    }

Crea l'animazione personalizzata .: 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.