Le problème de l'arrière-plan blanc est causé par le démarrage à froid d'Android pendant que l'application se charge en mémoire, et il peut être évité de cette façon :
public class OnboardingWithCenterAnimationActivity extends AppCompatActivity {
public static final int STARTUP_DELAY = 300;
public static final int ANIM_ITEM_DURATION = 1000;
public static final int ITEM_DELAY = 300;
private boolean animationStarted = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_onboarding_center);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (!hasFocus || animationStarted) {
return;
}
animate();
super.onWindowFocusChanged(hasFocus);
}
private void animate() {
ImageView logoImageView = (ImageView) findViewById(R.id.img_logo);
ViewGroup container = (ViewGroup) findViewById(R.id.container);
ViewCompat.animate(logoImageView)
.translationY(-250)
.setStartDelay(STARTUP_DELAY)
.setDuration(ANIM_ITEM_DURATION).setInterpolator(
new DecelerateInterpolator(1.2f)).start();
for (int i = 0; i < container.getChildCount(); i++) {
View v = container.getChildAt(i);
ViewPropertyAnimatorCompat viewAnimator;
if (!(v instanceof Button)) {
viewAnimator = ViewCompat.animate(v)
.translationY(50).alpha(1)
.setStartDelay((ITEM_DELAY * i) + 500)
.setDuration(1000);
} else {
viewAnimator = ViewCompat.animate(v)
.scaleY(1).scaleX(1)
.setStartDelay((ITEM_DELAY * i) + 500)
.setDuration(500);
}
viewAnimator.setInterpolator(new DecelerateInterpolator()).start();
}
}
}
mise en page
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?colorPrimary"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="144dp"
tools:ignore="HardcodedText"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:alpha="0"
android:text="Hello world" android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
android:textColor="@android:color/white"
android:textSize="22sp"
tools:alpha="1"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:alpha="0"
android:gravity="center"
android:text="This a nice text"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse"
android:textSize="20sp"
tools:alpha="1"
/>
<Button
android:id="@+id/btn_choice1"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:scaleX="0"
android:scaleY="0"
android:text="A nice choice"
android:theme="@style/Button"
/>
<Button
android:id="@+id/btn_choice2"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:scaleX="0"
android:scaleY="0"
android:text="Far better!"
android:theme="@style/Button"
/>
</LinearLayout>
<ImageView
android:id="@+id/img_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/img_face"
tools:visibility="gone"
/>
</FrameLayout>
visage en image
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<item android:drawable="?colorPrimary"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/img_face"/>
</item>
Ajoutez ce thème à votre écran d'accueil dans le manifeste.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<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/colorAccent</item>
<item name="android:windowBackground">@null</item>
</style>
<style name="AppTheme.CenterAnimation">
<item name="android:windowBackground">@drawable/ll_face_logo</item>
</style>
ce qui produira un effet comme celui-ci
![a busy cat]()
Pour plus de détails et de solutions, vous pouvez consulter le site suivant BlogPost
1 votes
Vous avez trouvé le problème vous-même, vous faites trop d'init dans le contexte de l'application, bloquant le chargement de l'activité, essayez d'asynchroniser ceci, laissant une activité de chargement s'afficher jusqu'à ce qu'un thread se termine.
0 votes
Ce site pourrait aider
0 votes
Avez-vous envisagé le chargement paresseux ? Je pense que vous êtes sur la bonne voie avec des services qui ne sont pas sur le fil principal.
0 votes
@BeshoyHanna : veuillez expliquer comment nous pourrions utiliser cela ici ....
1 votes
Idéalement, une application devrait décharger le traitement et ne pas utiliser le thread principal pour les opérations longues. C'est une pratique bien acceptée. Si les opérations doivent être effectuées avant le chargement de l'application, elles ne doivent pas partager un thread avec l'interface utilisateur.
1 votes
Vous constaterez peut-être que le problème persiste après avoir déplacé tout le code d'initialisation en dehors de l'espace de travail.
Application
classe. Cela est dû à la façon dont les nouvelles versions d'Android "démarrent à froid" les applications. Google a abordé le problème des délais de lancement lors de la Google I/O de cette année et il sera corrigé dans N si je me souviens bien. En attendant, vous devriez regarder ce que Google appelle un "écran de lancement de marque". Voici un exemple sur la façon de le créer : antonioleiva.com/écran de lancement de la marque - plus d'écran blanc au début ;-) Et s'il vous plaît, n'utilisez pas de splashscreens - c'est ennuyeux pour l'utilisateur.0 votes
@BeshoyHanna : Donc je devrais utiliser une
IntentService
alors ?0 votes
Anders : idée intéressante ... :)
0 votes
@AxelH : veuillez être plus précis ... que dois-je utiliser exactement ? Un service ? Un Thread ?
0 votes
@Darwind : wow ... idée cool ! Ça a l'air bien. Vous devriez le poster comme une réponse ... :)
1 votes
En ce qui concerne le thème, l'astuce n'est pas de définir un thème NoActionBar, mais d'ajuster le thème de l'activité initiale de manière à ce qu'un écran vide à thème ressemble à un écran entièrement initialisé.
0 votes
Si vous utilisez Android studio 2.0, désactivez l'exécution instantanée et ce problème sera résolu.
0 votes
Au fait, savez-vous que le
Application
L'instance peut être conservée même lorsque toutes vos activités sont terminées ? Lorsque cela se produit,Application#onCreate()
sera pas sera appelé à nouveau lors du prochain lancement de votre application.0 votes
@KevinKrumwiede : oui, c'est le cas lorsque l'application est toujours en arrière-plan, et que le processus de l'application est bien vivant. Si vous quittez l'application, le processus est tué, l'icône de l'application est affichée.
Application
L'instance a disparu, et l'écran blanc est revenu en force... :)0 votes
@Amir : Je pense que vous vous trompez sur ce que je demande. Cela n'a rien à voir avec Instant Run. C'est un problème de longue date avec les applications Android. Il se produit indépendamment de la version du système d'exploitation et même avec des projets construits avec Eclipse.
0 votes
Quelles sont les opérations dans Application#onCreate(). S'agit-il d'IO ?
0 votes
Je n'ai pas étendu la classe d'application mais j'obtiens toujours l'écran blanc.
0 votes
Quel est l'intérêt d'utiliser un thread, un service pour charger quelque chose plus tard ? Vous n'avez pas besoin de tous ces éléments lorsque l'utilisateur ouvre votre application ? Cela n'a pas de sens. Il suffit d'avoir un écran d'accueil et c'est tout. Même les applications officielles de Google le font.