J'essaie d'ajouter un effet de fondu lorsque mon activité d'écran de démarrage se termine et/ou lorsque mon activité principale commence (idéalement, l'activité principale s'estomperait après que l'écran de démarrage se termine mais j'essaye quoi que ce soit). J'ai essayé beaucoup de choses impliquant des animations et des transitions, mais aucune d'elles n'a fonctionné jusqu'ici. Comme vous pouvez le voir, je ne suis pas du tout familier avec les animations, et je suis conscient que mon problème vient probablement de mon manque de connaissance à ce sujet. J'ai beaucoup lu mais je me sens toujours perdu. Je me demandais si le fait que mon SplashActivity n'ait pas de mise en page en tant que vue de contenu affectait mes résultats. Je n'utilise qu'un thème pour l'activité de l'écran de démarrage. Voici sa mise en œuvre dans le manifeste:Effet de fondu entre deux activités sur Android
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
et le thème (d'abord sans les 2 derniers éléments):
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/launch_logo</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
J'ai aussi essayé d'ajouter un « fondu dans le thème » à mon MainActivity:
<style name="AppTheme.FadeIn" parent="AppTheme" >
<item name="android:windowNoTitle">true</item>
<item name="android:activityOpenEnterAnimation">@anim/fade_in</item>
</style>
En ce qui concerne l'animation, j'ai vu que les gens étaient parfois en utilisant:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<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="1000" />
</set>
alors que d'autres fois en utilisant:
<?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="1000" />
J'essayé les deux ... (question facultative: quelle est la différence entre eux)
En SplashActivity, j'ai essayé:
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
et
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
startActivity(intent, bundle);
Vous avez essayé aussi dans Fonction onCreate de MainActivity:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ViewGroup mRootView = (ViewGroup) findViewById(R.id.main_layout);
Fade mFade = new Fade(IN);
// Start recording changes to the view hierarchy
TransitionManager.beginDelayedTransition(mRootView, mFade);
et
ViewGroup mRootView = (ViewGroup) findViewById(R.id.main_layout);
mRootView.animate().alpha(0.0f); // at this point the view is totally transparent
mRootView.animate().alpha(1.0f).setDuration(2000); // here the view becomes 100% visible instantly, there is no animation
C'est la mise en page de l'activité principale:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:weightSum="16"
android:background="@color/background"
android:animateLayoutChanges="true"
tools:context=".MainActivity">
...
J'ai vérifié cette échelle d'animation de transition était correct dans mes paramètres (j'utilise Android L'émulateur de Studio pour mes tests). Il n'y a jamais eu d'effet de fondu entre mes deux activités. S'il te plaît, quelqu'un m'éclaire.
.
.
Pour une raison quelconque, j'ai une sorte d'effet fondu quand je fais ceci:
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(),
android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
startActivity(intent, bundle);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
Je ne comprends vraiment pas. Bien sûr, il devient noir alors l'effet de fondu de l'activité principale fonctionne, mais je ne comprends pas pourquoi cela fonctionne de cette façon. Si je supprime une seule ligne, elle cesse de fonctionner (j'ai découvert que cela fonctionnait de cette façon quand j'ai oublié de commenter la deuxième commande startActivity).Quand je dis que j'ai essayé de supprimer une ligne, j'ai également changé l'ordre comme ceci:
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(),
android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent, bundle);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); // with or without this line, this code doesn't work.
// I must have tried pretty much all combinations without any success...
.
.
.
.
.
Je poste simplement ici ce que j'ai fait après avoir échoué à utiliser toutes les solutions précédentes (que j'ai essayées séparément). J'attache un booléen supplémentaire à l'intention lorsque je veux obtenir un effet de fondu lors de l'ouverture de ma prochaine activité. Puis, dans la méthode onCreate de l'activité d'ouverture, je:
boolean fadeEffect = getIntent().getBooleanExtra("fade_in", false);
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.login_main_layout);
if(fadeEffect) {
mainLayout.setAlpha(0.f);
mainLayout.animate()
.alpha(1.f)
.setDuration(1000)
.start();
}
Si quelqu'un a besoin d'aide mise en œuvre de ce type de solution, je peux aider.
Essayez d'utiliser les animations de fondu par défaut au lieu de créer les vôtres. Lisez ceci: https://developer.android.com/training/transitions/transitions.html –
Merci, j'ai essayé d'utiliser les animations par défaut Android aussi, mais toujours pas de résultat ... – Lilamuse
Qu'avez-vous essayé avec anim par défaut Android? ils devraient fonctionner très bien en utilisant la classe Fade! –