web-dev-qa-db-fra.com

Modifier la transition d'entrée / sortie de DialogFragment juste avant la fermeture

J'ai un DialogFragment et j'ai défini une animation pour entrer/sortir dans la méthode onActivityCreated comme ci-dessous

  @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow()
                .getAttributes().windowAnimations = R.style.DialogAnimation;
    }

mes fichiers de style DialogAnimation sont les suivants

<style name="DialogAnimation">
        <item name="Android:windowEnterAnimation">@Android:anim/fade_in</item>
        <item name="Android:windowExitAnimation">@Android:anim/fade_out</item>
    </style>

Cela fonctionne pour moi maintenant ...

Maintenant, mon problème est que je veux avoir deux animations de sortie différentes, une pour le bouton OK et une pour le bouton Annuler. sur la façon dont cela peut être réalisé ... C'est ce que j'ai essayé.

  @Override
    public void onClick(View v) {
        getDialog().getWindow()
                .getAttributes().windowAnimations = R.style.DialogAnimation2;
        this.dismiss();
    }
35
Dominic D'Souza

Vous pouvez le faire à l'intérieur de votre DialogFragment, sans changer

getDialog().getWindow()
            .getAttributes().windowAnimations

Vous devez animer la "vue décor" dans onStart et onClick.

Voici le code coupé:

Créer une boîte de dialogue en premier

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle("Hello from animated dialog :)")
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                //we have to add button here and then override it's click in onStart
                            }
                        }
                )
                .setCancelable(false)
                .create();
    }

Remplacez ensuite la méthode onStart

@Override
    public void onStart() {
        super.onStart();

        AlertDialog dialog = (AlertDialog)getDialog();

        final View decorView = getDialog()
                .getWindow()
                .getDecorView();

        ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
                PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f));
        scaleDown.setDuration(2000);
        scaleDown.start();


        Button positiveButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
        positiveButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final View decorView = getDialog()
                        .getWindow()
                        .getDecorView();

                ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
                        PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
                        PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
                        PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f));
                scaleDown.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        dismiss();
                    }

                    @Override
                    public void onAnimationStart(Animator animation) {
                    }
                    @Override
                    public void onAnimationCancel(Animator animation) {
                    }
                    @Override
                    public void onAnimationRepeat(Animator animation) {
                    }
                });
                scaleDown.setDuration(2000);
                scaleDown.start();
            }
        });
    }

Voici l'animation du résultat

Demo of the result


Et si vous supprimez les propriétés d'échelle de mon code, vous n'obtiendrez qu'une animation alpha. Exactement comme vous le vouliez.

Enlève ça:

PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
48
Danylo Volokh

Vous pouvez définir des animations Up & Down pour un fragment de dialogue. Dans 'res/anim', ajoutez deux fichiers:

// Animation vers le haut

<?xml version="1.0" encoding="utf-8"?>
<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:toYDelta="0" />

</set>

// Animation de diapositive Dowm

<?xml version="1.0" encoding="utf-8"?>
<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" />

</set>

// Style

<style name="DialogAnimation">
    <item name="Android:windowEnterAnimation">@anim/slide_up</item>
    <item name="Android:windowExitAnimation">@anim/slide_down</item>
</style>

// Fragment de dialogue intérieur

@Override
public void onActivityCreated(Bundle arg0) {
    super.onActivityCreated(arg0);
    getDialog().getWindow()
   .getAttributes().windowAnimations = R.style.DialogAnimation;
}
22
Akhil Jayakumar

Je pense que la meilleure approche est d'appeler les différentes animations sur clic de bouton. Par conséquent, vous auriez quelque chose de similaire à ce qui suit:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button OkButton = (Button) findViewById(R.id.btnOk);
        Button CancelButton = (Button) findViewById(R.id.btnCancel);

        OkButton.setOnClickListener(new OnClickListener() {

            @Override    
            public void onClick(View view) {
                    getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;    
            }
        });
        return true;

        CancelButton.setOnClickListener(new OnClickListener() {

            @Override    
            public void onClick(View view) {
                getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation2;    
            }
        });
        return true;
    }

Si j'étais vous, j'utiliserais également des conventions de dénomination correctes pour référence future. Par exemple, définissez DialogAnimation sur OkAnimation et DialogAnimation2 sur CancelAnimation.

Accueil ça aide :)

3
Michele La Ferla

Une façon simple de faire ce que vous voulez est d'utiliser des écouteurs d'animation comme.

    animation.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            // dismiss your dialog in here and it will work
        }
    });

Démarrez l'animation sur votre méthode onclick et fermez la boîte de dialogue sur la méthode onAnimationEnd (). Vous devrez peut-être créer des objets de snimation et les démarrer manuellement avec la méthode startAnimation (animation) de View.

2
Arslan

Vous devez définir un thème pour votre boîte de dialogue de base

disons :-

public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        // Set a theme on the dialog builder constructor!
        AlertDialog.Builder builder = 
            new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme );

        builder  
        .setTitle( "Your title" )
        .setMessage( "Your message" )
        .setPositiveButton( "OK" , new DialogInterface.OnClickListener() 
            {      
              @Override
              public void onClick(DialogInterface dialog, int which) {
              dismiss();                  
            }
        });
        return builder.create();
    }
}

Il vous suffit ensuite de définir le thème qui inclura l'animation souhaitée. Dans styles.xml, ajoutez votre thème personnalisé:

<style name="MyCustomTheme" parent="@Android:style/Theme.Panel">
    <item name="Android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>

<style name="MyAnimation.Window" parent="@Android:style/Animation.Activity"> 
    <item name="Android:windowEnterAnimation">@anim/anim_in</item>
    <item name="Android:windowExitAnimation">@anim/anim_out</item>
</style> 

se référer ce

0
Praveen Sharma