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