Comment définir la transition entre deux activités pour Android 1.5 et versions ultérieures? J'aimerais qu'une activité se fonde.
Vous pouvez le faire avec Activity.overridePendingTransition()
. Vous pouvez définir des animations de transition simples dans un fichier de ressources XML.
Voici le code pour faire un joli fondu entre deux activités.
Créez un fichier appelé fadein.xml
dans res/anim
<?xml version="1.0" encoding="utf-8"?>
<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="2000" />
Créez un fichier appelé fadeout.xml
dans res/anim
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="2000" />
Si vous souhaitez disparaître de Activité A en Activité B , indiquez ce qui suit dans la méthode onCreate()
pour Activité B . Avant setContentView()
fonctionne pour moi.
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
Si les fondus sont trop lents pour vous, changez Android:duration
dans les fichiers xml ci-dessus en quelque chose de plus petit.
Un moyen encore facile de le faire est:
<style name="WindowAnimationTransition"> <item name="Android:windowEnterAnimation">@Android:anim/fade_in</item> <item name="Android:windowExitAnimation">@Android:anim/fade_out</item> </style>
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar"> <item name="Android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style>
C'est tout :)
Oui. Vous pouvez indiquer au SE quel type de transition vous souhaitez pour votre activité.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().setWindowAnimations(ANIMATION);
...
}
Où ANIMATION est un entier faisant référence à une animation intégrée au système d'exploitation.
Pour une liste des animations par défaut, voir: http://developer.Android.com/reference/Android/R.anim.html
Il existe en effet fade_in
et fade_out
pour les API de niveau 1 et supérieur.
créer res> anim> fadein.xml
<?xml version="1.0" encoding="utf-8"?>
<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" />
créer res> anim> fadeout.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="500" />
Dans res> valeurs> styles.xml
<style name="Fade">
<item name="Android:windowEnterAnimation">@anim/fadein</item>
<item name="Android:windowExitAnimation">@anim/fadeout</item>
</style>
Dans les activités onCreate ()
getWindow().getAttributes().windowAnimations = R.style.Fade;
Voici le code pour faire une belle douceur entre deux activités.
effet lisse de gauche à droite
Créez un fichier appelé slide_in_right.xml et slide_out_right.xml dans res/anim
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false" >
<translate Android:duration="5000" Android:fromXDelta="100%" Android:toXDelta="0%" />
<alpha Android:duration="5000" Android:fromAlpha="0.0" Android:toAlpha="1.0" />
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false" >
<translate Android:duration="5000" Android:fromXDelta="0%" Android:toXDelta="-100%"/>
<alpha Android:duration="5000" Android:fromAlpha="1.0" Android:toAlpha="0.0" />
</set>
effet lisse de droite à gauche
Créez un fichier appelé animation_enter.xml et animation_leave.xml dans res/anim
animation_enter.xml
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate Android:fromXDelta="-100%" Android:toXDelta="0%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700"/>
</set>
animation_leave.xml
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:fromXDelta="0%" Android:toXDelta="100%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700" />
</set>
Naviguer d'une activité à une autre activité
Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
startActivity(intent_next);
finish();
4. Appuyez sur l'événement précédent ou naviguez d'une deuxième activité à une activité.
Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
startActivity(home_intent);
finish();
Je remplace mon animation d'activité par défaut. Je teste dans api 15 que cela fonctionne bien. Voici la solution que j'utilise:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorPrimary</item>
<item name="Android:windowAnimationStyle">@style/CustomActivityAnimation</item>
</style>
<style name="CustomActivityAnimation" parent="@Android:style/Animation.Activity">
<item name="Android:activityOpenEnterAnimation">@anim/slide_in_right</item>
<item name="Android:activityOpenExitAnimation">@anim/slide_out_left</item>
<item name="Android:activityCloseEnterAnimation">@anim/slide_in_left</item>
<item name="Android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
Créez un dossier anim sous le dossier res, puis créez ces quatre fichiers d’animation:
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="100%p" Android:toXDelta="0"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="0" Android:toXDelta="-100%p"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="-100%p" Android:toXDelta="0"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="0" Android:toXDelta="100%p"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
Vous pouvez télécharger mon exemple de projet .
C'est tout... :)
Vous ne pouvez pas utiliser overridePendingTransition dans Android 1.5. overridePendingTransistion est venu à Android 2.0.
Si vous allez traverser cela sans aucune erreur, vous devez compiler pour la cible (1.5 ou plus) en utilisant les animations ordinaires (ou vous-même) ou vous devez compiler pour la cible (2.0 ou plus) en utilisant overridePendingTransistion.
Résumé: Vous ne pouvez pas utiliser overridePendingTransistion dans Android 1.5 .
Vous pouvez cependant utiliser les animations intégrées dans le système d'exploitation.
DANS GALAXY Devices:
Vous devez vous assurer de ne pas l'avoir éteint sur l'appareil en utilisant Paramètres> Options pour les développeurs:
Avant de commencer votre intention:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());
Cela donne une animation par défaut à votre transition d'activité.
Utilisez ActivityCompat.startActivity () works API> 21.
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
ActivityCompat.startActivity(activity, intent, options.toBundle());
Certaines versions d’Android prennent en charge les transitions personnalisées Activity
et d’autres pas (appareils plus anciens). Si vous souhaitez utiliser des transitions personnalisées, il est recommandé de vérifier si la variable Activity
a la méthode overridePendingTransition()
, contrairement aux versions précédentes.
Pour savoir si la méthode existe ou non, une API de réflexion peut être utilisée. Voici le code simple qui va vérifier et renvoyer la méthode si elle existe:
Method mOverridePendingTransition;
try {
mOverridePendingTransition = Activity.class.getMethod(
"overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
/* success */
} catch (NoSuchMethodException nsme) {
/* failure, this version of Android doesn't have this method */
}
Et ensuite, nous pouvons appliquer notre propre transition, c'est-à-dire utiliser cette méthode si elle existe:
if (UIConstants.mOverridePendingTransition != null) {
try {
UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Ici, à titre d'exemple, de simples animations de fondu en fondu ont été utilisées pour la démonstration de transition.
zoom avant sur l'animation
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();
zoom_enter
<?xml version="1.0" encoding="utf-8"?>
<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" />
zoom_exit
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="1.0" Android:toAlpha="0.0"
Android:fillAfter="true"
Android:duration="500" />