Être DialogFragment
une enveloppe pour le Dialog
vous devez définir un thème pour votre classe de base Dialog
pour obtenir l'animation que vous souhaitez :
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 ajouter 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>
Ajoutez maintenant les fichiers d'animation dans le répertoire res/anim dossier :
( le android:pivotY
est la clé )
anim_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/linear_interpolator"
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:fillAfter="false"
android:startOffset="200"
android:duration="200"
android:pivotX = "50%"
android:pivotY = "-90%"
/>
<translate
android:fromYDelta="50%"
android:toYDelta="0"
android:startOffset="200"
android:duration="200"
/>
</set>
anim_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/linear_interpolator"
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:fillAfter="false"
android:duration="200"
android:pivotX = "50%"
android:pivotY = "-90%"
/>
<translate
android:fromYDelta="0"
android:toYDelta="50%"
android:duration="200"
/>
</set>
Enfin, le plus difficile ici est de faire croître votre animation à partir du centre de chaque rangée. Je suppose que la rangée remplit l'écran horizontalement, donc, d'un côté, l'élément android:pivotX
sera statique. En revanche, vous ne pouvez pas modifier la valeur de l'option android:pivotY
de manière programmatique.
Ce que je suggère, c'est de définir plusieurs animations, chacune d'entre elles ayant une valeur de pourcentage différente sur l'écran d'affichage. android:pivotY
(et plusieurs thèmes faisant référence à ces animations). Ensuite, lorsque l'utilisateur touche la rangée, calculez la position Y en pourcentage de la rangée sur l'écran. Connaissant la position en pourcentage, attribuez un thème à votre boîte de dialogue qui a l'attribut android:pivotY
valeur.
Il ne s'agit pas d'une solution parfaite, mais elle pourrait faire l'affaire pour vous. Si vous n'aimez pas le résultat, je vous suggère d'oublier l'option DialogFragment
et animer un simple View
à partir du centre exact de la rangée.
Bonne chance !