Je souhaite obtenir un effet de glissement de gauche à droite lorsque je passe d'une activité à une autre. Pour cela, j'utilise le code suivant, mais je n'obtiens aucun résultat. S'il vous plaît corrigez-moi.
En Java, les deux fichiers:
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
setContentView(R.layout.main);
Deux fichiers dans le répertoire res/anim:
fadein.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="5000"
Android:fromAlpha="0.0"
Android:interpolator="@Android:anim/slide_out_right"
Android:toAlpha="1.0" >
</alpha>
fadeout.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="5000"
Android:fromAlpha="0.0"
Android:interpolator="@Android:anim/slide_in_left"
Android:toAlpha="1.0" >
</alpha>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
new Handler().postDelayed(new Runnable() {
public void run() {
/* Create an intent that will start the main activity. */
Intent mainIntent = new Intent(SplashScreen.this,
ConnectedActivity.class);
mainIntent.putExtra("id", "1");
//SplashScreen.this.startActivity(mainIntent);
startActivity(mainIntent);
/* Finish splash activity so user cant go back to it. */
SplashScreen.this.finish();
/* Apply our splash exit (fade out) and main
entry (fade in) animation transitions. */
overridePendingTransition(R.anim.mainfadein,R.anim.splashfadeout);
}
}, SPLASH_DISPLAY_TIME);
}
Ajoutez ces deux fichiers dans le dossier res/anim.
slide_in.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromXDelta="100%p"
Android:toXDelta="0%p"/>
slide_out.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromXDelta="0%p"
Android:toXDelta="-100%p"/>
Et écrivez le code suivant dans la méthode onCreate () de la prochaine activité que vous transmettez dans l'intention.
overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
Vous pouvez écraser votre animation d'activité par défaut pour qu'elle soit plus performante que overridePendingTransition. J'utilise cette solution qui fonctionne pour toutes les versions d'Android. Il suffit de copier/coller 4 fichiers et d’ajouter un style de 4 lignes comme ci-dessous:
Créez un "CustomActivityAnimation" et ajoutez-le à votre thème de base par "windowAnimationStyle".
<!-- 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>
Ensuite, créez le dossier anim sous le dossier res puis créez ces quatre fichiers d’animation dans le dossier anim:
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>
Si vous rencontrez un problème, vous pouvez télécharger mon exemple de projet depuis github .
Merci
Glisser vers le haut/bas avec animation alpha avec quelques notes
slide_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@integer/activity_transition_time"
>
<translate
Android:fromYDelta="100%p"
Android:toYDelta="0"/>
<alpha
Android:fromAlpha="0.5"
Android:toAlpha="1"/>
</set>
slide_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@integer/activity_transition_time"
>
<translate
Android:fromYDelta="0"
Android:toYDelta="100%p"/>
<alpha
Android:fromAlpha="1"
Android:toAlpha="0.5"/>
</set>
no_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@integer/activity_transition_time"
Android:fromYDelta="0"
Android:toYDelta="0"/>
Première activité
startActivity(new Intent(this, SecondActivity.class));
overridePendingTransition(R.anim.slide_up, R.anim.no_animation); // remember to put it after startActivity, if you put it to above, animation will not working
// document say if we don't want animation we can put 0. However, if we put 0 instead of R.anim.no_animation, the exist activity will become black when animate
Deuxième activité
finish();
overridePendingTransition(R.anim.no_animation, R.anim.slide_down);
Terminé
PLUS
J'essaie de créer une animation de diapositive semblable à une animation iOS lorsqu'un modèle de vue est présenté (comme ceci https://www.youtube.com/watch?v=deZobvh2064 } _) mais j'ai échoué.
En regardant l'animation actuelle d'iOS, vous verrez: L'animation du bas avec alpha (environ 50%), puis elle va très vite, puis plus lentement, la durée de l'animation est d'environ 500 ms (j'utilise des outils de découpe vidéo pour compter le temps d'animation https://www.kapwing.com/trim-video donc il ne peut pas exactement à 100%)
Ensuite, j'essaie de postuler sur Android.
Pour faire de l'alpha, j'utilise <alpha>
et succès.
Pour que l’animation démarre plus vite que plus lentement, j’utilise Android:interpolator="a decelerate interpolator"
mais cela a presque échoué.
Il y a 3 decelerate interpolator
par défaut dans Android@Android:interpolator/decelerate_quad
-> facteur = 1@Android:interpolator/decelerate_cubic
-> facteur = 1,5@Android:interpolator/decelerate_quint
_> facteur = 2,5
(facteur plus élevé <=> l’animation démarre plus rapidement au début et plus lentement à la fin)
Voici un bon tutoriel http://cogitolearning.co.uk/2013/10/Android-animations-tutorial-5-more-on-interpolators/ pour le comprendre
J'ai essayé 3 ci-dessus, je ne peux pas atteindre comme iOS, l'animation ne peut pas démarrer plus vite que iOS. Ensuite, je crée un outil personnalisé avec un facteur = 3, comme
<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:factor="3" />
et j'augmente la durée de 500 -> 750
. Cela fonctionne bien (très similaire à iOS). Cependant, cela ne fonctionne que sur certains appareils, mais l'animation est assez lente sur certains appareils. Par la suite, je sais que l’animation peut varier d’un appareil à l’autre (par exemple, certains appareils seront plus rapides et d’autres plus lentement), de sorte que je ne peux pas en faire une animation similaire sur tous les appareils Android. Par conséquent, je n'utilise pas interpolator
. Je ne sais pas si mes tests sont exactement à 100% ou non, mais j'espère que cette expérience aidera
Vous pouvez utiliser overridePendingTransition
dans startActivity
au lieu de onCreate
. Au moins, ça marche pour moi!
Voir un exemple complet ici . Cela inclut une animation (inversée) sur BackPressed, donc en revenant à l'activité précédente! Dans votre exemple spécifique (ouverture/fermeture en fondu), cela peut être inutile.
Disons que vous avez deux activités.
Et sur un clic de bouton, cela se produit.
1) Activer la transition de contenu
Accédez à votre style.xml
et ajoutez cette ligne pour activer la transition de contenu.
<item name="Android:windowContentTransitions">true</item>
2) Écrire la transition d'entrée et de sortie par défaut pour votre AllCastActivity
public void setAnimation()
{
if(Build.VERSION.SDK_INT>20) {
Slide slide = new Slide();
slide.setSlideEdge(Gravity.LEFT);
slide.setDuration(400);
slide.setInterpolator(new AccelerateDecelerateInterpolator());
getWindow().setExitTransition(slide);
getWindow().setEnterTransition(slide);
}
}
3) Commencez l'activité avec l'intention
Écrivez cette méthode dans votre MovieDetailActivity
pour commencer AllCastActivity
public void startActivity(){
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putStringArrayListExtra(MOVIE_LIST, movie.getImages());
if(Build.VERSION.SDK_INT>20)
{
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(BlankActivity.this);
startActivity(i,options.toBundle());
}
else {
startActivity(i);
}
}
placez votre méthode setAnimation()
method avant setContentView()
sinon l’animation ne fonctionnera pas.
Donc, votre AllCastActivity.Java
devrait ressembler à ceci
class AllCastActivity extends AppcompatActivity {
@Override
protected void onCreate(Bundle savedInstaceState)
{
super.onCreate(savedInstaceState);
setAnimation();
setContentView(R.layout.all_cast_activity);
.......
}
private void setAnimation(){
if(Build.VERSION.SDK_INT>20) {
Slide slide = new Slide();
slide.setSlideEdge(Gravity.LEFT);
..........
}
}
L'animation de diapositives peut être appliquée aux transitions d'activité en appelant overridePendingTransition et en transmettant des ressources d'animation pour les activités d'entrée et de sortie.
Les animations de diapositive peuvent être glissées vers la droite, vers la gauche, vers le haut et vers le bas.
Glisser vers le haut
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/linear_interpolator">
<scale
Android:duration="800"
Android:fromXScale="1.0"
Android:fromYScale="1.0"
Android:toXScale="1.0"
Android:toYScale="0.0" />
</set>
Glisse vers le bas
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/linear_interpolator">
<scale
Android:duration="800"
Android:fromXScale="1.0"
Android:fromYScale="0.0"
Android:toXScale="1.0"
Android:toYScale="1.0" />
</set>
overridePendingTransition (R.anim.slide_down, R.anim.slide_up);
Voir exemples d'animation de transition d'activité pour plus d'exemples de transition d'activité.
Exemple Kotlin:
private val SPLASH_DELAY: Long = 1000
internal val mRunnable: Runnable = Runnable {
if (!isFinishing) {
val intent = Intent(applicationContext, HomeActivity::class.Java)
startActivity(intent)
overridePendingTransition(R.anim.slide_in, R.anim.slide_out);
finish()
}
}
private fun navigateToHomeScreen() {
//Initialize the Handler
mDelayHandler = Handler()
//Navigate with delay
mDelayHandler!!.postDelayed(mRunnable, SPLASH_DELAY)
}
public override fun onDestroy() {
if (mDelayHandler != null) {
mDelayHandler!!.removeCallbacks(mRunnable)
}
super.onDestroy()
}
mettre les animations dans le dossier anim:
slide_in.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromXDelta="100%p"
Android:toXDelta="0%p">
</translate>
slide_out.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="@Android:integer/config_longAnimTime"
Android:fromXDelta="0%p"
Android:toXDelta="-100%p">
</translate>
USAGE
navigateToHomeScreen();