2017-07-03 3 views
1

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.

+1

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 –

+0

Merci, j'ai essayé d'utiliser les animations par défaut Android aussi, mais toujours pas de résultat ... – Lilamuse

+0

Qu'avez-vous essayé avec anim par défaut Android? ils devraient fonctionner très bien en utilisant la classe Fade! –

Répondre

2

Ajouter ce pack d'options à votre méthode startActivity pour faire fondu anim entre deux activités:

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), 
     android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
     startActivity(intent, bundle); 

Il n'y a pas besoin d'ajouter un autre code pour accomplir ce que vous avez demandé! :)

+0

Toujours ne fonctionne pas ...:/ – Lilamuse

0

J'ai eu des problèmes similaires avec les animations entre les activités.

Je sais que vous avez dit que vous avez essayé déjà, mais la solution

Intent intent = new Intent(this, MainActivity.class); 
startActivity(intent); 
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 

devrait fonctionner aussi longtemps que vous ne l'avez pas sali autour avec d'autres animations de fenêtre. Peut-être en utilisant une combinaison de solutions possibles, cela ne fonctionnait pas correctement? Essayez de supprimer les autres et de coller avec cette solution.

+0

J'ai essayé chaque solution séparément et ce fut mon seule animation de fenêtre. Juste pour m'assurer que j'ai encore essayé mais il n'y a aucun effet. Ce que j'ai fait après qu'aucune de mes tentatives n'ait réussi, j'ai créé un "fade-in" supplémentaire pour mes activités qui ont potentiellement besoin de s'estomper. Je vais éditer ma question pour ajouter le code que j'ai utilisé car il fait mon commentaire trop longtemps si je tente de le poster ici. – Lilamuse