Comment définir la transition entre deux activités pour Android 1.5 et versions ultérieures? J'aimerais qu'une activité disparaisse.
Réponses:
Vous pouvez le faire avec Activity.overridePendingTransition()
. Vous pouvez définir des animations de transition simples dans un fichier de ressources XML.
onCreate
fonction de votre activité .
Voici le code pour effectuer un bon fondu en douceur entre deux activités.
Créez un fichier appelé fadein.xml
dansres/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
dansres/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 voulez effacer de l' activité A à l' activité B , mettre ce qui suit dans la onCreate()
méthode de l' activité B . Avant setContentView()
travaille pour moi.
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
Si les fondus sont trop lents pour vous, remplacez android:duration
les fichiers xml ci-dessus par quelque chose de plus petit.
overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);
visualisation de ces fichiers peut également vous donner des conseils sur la façon d'améliorer vos animations personnalisées (par exemple, en prolongeant la durée du fondu avant).
fadein
et fadeout
de fade_in
et fade_out
. From Dan J's post
overridePendingTransition()
juste après avoir appelé finish()
et / ou startActivity()
. J'ai pu obtenir un joli fondu de cette façon en l'appelant juste après le lancement de la nouvelle activité.
Un moyen encore plus simple 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 ça :)
Oui. Vous pouvez indiquer au système d'exploitation le type de transition que vous souhaitez avoir 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 dans le système d'exploitation.
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> values> styles.xml
<style name="Fade">
<item name="android:windowEnterAnimation">@anim/fadein</item>
<item name="android:windowExitAnimation">@anim/fadeout</item>
</style>
Dans les activités surCréer ()
getWindow().getAttributes().windowAnimations = R.style.Fade;
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Pour une liste des animations par défaut, voir: http://developer.android.com/reference/android/R.anim.html
Il existe en fait fade_in
et fade_out
pour les API de niveau 1 et plus.
J'écrase mon animation d'activité par défaut. Je le teste dans l'API 15 pour qu'il fonctionne correctement. 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... :)
Voici le code pour faire une belle fluidité 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>
Naviguez d'une activité à une seconde 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. sur l'événement de presse de retour ou naviguer 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();
overridePendingTransition
immédiatement après startActivity: developer.android.com/reference/android/app/…
Vous ne pouvez pas utiliser overridePendingTransition dans Android 1.5. overridePendingTransistion est venu à Android 2.0.
Si vous voulez passer par là sans aucune erreur, vous devez compiler pour la cible (1.5 ou supérieure) en utilisant les animations ordinaires (ou que vous possédez) ou vous devez compiler pour la cible (2.0 ou supérieure) 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.
Appareils IN GALAXY:
Vous devez vous assurer que vous ne l'avez pas désactivé sur l'appareil à l'aide des paramètres> Options du développeur:
Utilisez l'API ActivityCompat.startActivity () works> 21.
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
ActivityCompat.startActivity(activity, intent, options.toBundle());
Certaines versions d'Android prennent en charge les Activity
transitions personnalisées et d'autres non (appareils plus anciens). Si vous souhaitez utiliser des transitions personnalisées, il est recommandé de vérifier si le Activity
a la overridePendingTransition()
méthode, comme sur les anciennes versions, ce n'est pas le cas.
Pour savoir si la méthode existe ou non, l'API de réflexion peut être utilisée. Voici le code simple qui vérifiera et retournera 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 puis, 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 d'entrée et de sortie ont été utilisées pour la démonstration de transition.
zoom arrière 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" />
overridePendingTransition
réponses ci-dessous: Vous pouvez réussir(0, 0)
si vous ne voulez aucune animation.