web-dev-qa-db-fra.com

comment faire une animation pour une fenêtre popup dans android

J'ai une fenêtre popup dans mon application, elle apparaît quand un bouton a cliqué Je veux mettre un fondu en animation dans cette fenêtre, j'ai mis le fichier xml dans le dossier "res/anim" et défini le style d'animation pour la fenêtre popup mais l'animation ne marche pas? voici mes codes:

myanim.xml ...

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <alpha Android:fromAlpha="0.0"
        Android:toAlpha="1.0" 
        Android:interpolator="@Android:anim/accelerate_interpolator" 
        Android:duration="4000"
        Android:repeatCount="1"/>
</set>

================================================

Créer la fenêtre popup

private PopupWindow showOptions(Context mcon){
    try{ 
        LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.options_layout,null);
        layout.setAnimation(AnimationUtils.loadAnimation(this, R.anim.myanim));
        PopupWindow optionspu = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        optionspu.setFocusable(true);
        optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
        optionspu.update(0, 0, LayoutParams.WRAP_CONTENT, (int)(hei/5));
        optionspu.setAnimationStyle(R.anim.myanim);
        return optionspu;
    }
    catch (Exception e){e.printStackTrace();
    return null;}
}

================================================= onClick méthode ... (optionsPopup est une variable globale de type PopupWindow)

 @Override
public void onClick(View v) {
               switch (v.getId()) { 
        case R.id.options:
                optionsPopup=showOptions(this);
            break;  
}
41
Ishaq

Je pense que le problème est que vous n'avez fourni qu'un seul ensemble de styles d'animation. Mais en réalité, un PopupWindow nécessite deux animations. L'un sera utilisé par lui lorsque la fenêtre est affichée et l'autre pour masquer la fenêtre.

Voici comment vous devez le faire,

1) Créez deux jeux d'animations différents.

disons popup_show.xml et popup_hide.xml et ajoutez-le à votre dossier anim que vous devez créer à l'intérieur res = dossier.

2) Maintenant, dans le dossier values, créez un xml appelé styles.xml et ajoutez-y ces animations comme ceci,

<style name="Animation">
    <item name="Android:windowEnterAnimation">@anim/popup_show</item>
    <item name="Android:windowExitAnimation">@anim/popup_hide</item>
</style>

3) Maintenant, définissez ce style sur votre animation PopupWindow,

 popup.setAnimationStyle(R.style.Animation);

Maintenant, il détecte automatiquement l'entrée et la sortie de la fenêtre et fournit l'animation requise.

103
Andro Selva

j'utilise une animation popup avec ce code:

// Creating the PopupWindow
       layoutInflater = (LayoutInflater)     getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

       inflatedLayoutView = layoutInflater.inflate(R.layout.packages_popup,null);
     inflatedLayoutView.setAnimation(AnimationUtils.loadAnimation(this, R.animator.popupanim)


    popup_l = new PopupWindow(inflatedLayoutView);

   popup_l.setWidth(FrameLayout.LayoutParams.WRAP_CONTENT);
   popup_l.setHeight(FrameLayout.LayoutParams.WRAP_CONTENT);     
   popup_l.setFocusable(true);
   // Clear the default translucent background
   popup_l.setBackgroundDrawable(new BitmapDrawable());       

   popup_l.showAtLocation(parent, Gravity.CENTER, 0 , 0);   

   popup_l.setOutsideTouchable(false);

situé dans /res/animator/popupanim.xml (popupanim.xml) le code d'animation est:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<alpha Android:fromAlpha="0.0"
        Android:toAlpha="1.0" 
        Android:interpolator="@Android:anim/accelerate_interpolator" 
        Android:duration="500"
        Android:repeatCount="0"/>
</set>
13
aimiliano

Cela peut être un peu tard, mais la raison pour laquelle l'animation ne s'affiche pas est que vous affichez la fenêtre contextuelle avant de configurer votre animation.

optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
optionspu.setAnimationStyle(R.anim.myanim);

Inversez les deux lignes et vous verrez l'animation:

optionspu.setAnimationStyle(R.anim.myanim);
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
5
Simon

La disposition personnalisée PopupWindow est plus pratique, et la position d'affichage est la liberté, il n'y a aucune restriction. Utilisez le code ci-dessous et profitez de l'animation. Dans cette animation, utilisez la diapositive inférieure et la diapositive inférieure, mais vous ne pouvez modifier que l'animation de diapositive d'entrée/sortie et animer n'importe où dans votre application et une chose de plus en fonction de votre animation, vous devez changer votre gravité - >> BAS, HAUT, etc.

dossier de ressources anim:

1.slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:shareInterpolator="false"
    >

  <translate
      Android:duration="@integer/dialogplus_animation_default_duration"
      Android:fromXDelta="0%"
      Android:fromYDelta="100%"
      Android:toXDelta="0%"
      Android:toYDelta="0%"
      />
</set>

2.slide_out_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
     Android:shareInterpolator="false"
    >

  <translate
      Android:duration="@integer/dialogplus_animation_default_duration"
      Android:fromXDelta="0%"
      Android:fromYDelta="0%"
      Android:toXDelta="0%"
      Android:toYDelta="100%"
      />
</set>

Style:

<style name="popup_window_animation">
        <item name="Android:windowEnterAnimation">@anim/slide_in_bottom</item>
        <item name="Android:windowExitAnimation">@anim/slide_out_bottom</item>
    </style>

Méthode:

 private PopupWindow showOptions(Context mcon){
        try{
            LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.popup_option_documents_type,null);
            PopupWindow optionspu = new PopupWindow(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.setAnimationStyle(R.style.popup_window_animation);
            optionspu.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
            optionspu.setFocusable(true);
            optionspu.setOutsideTouchable(true);
            optionspu.update(0, 0, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.showAtLocation(layout, Gravity.BOTTOM, 0, 0);

            return optionspu;
        }
        catch (Exception e){e.printStackTrace();
            return null;}
    }
4
Kunwar Avanish