J'utilise l'application Google DrawerLayout
.
Lorsqu'un élément est cliqué, le tiroir est fermé en douceur et un message d'avertissement est affiché. Activity
sera lancé. Transformer ces activités en Fragment
s est no une option. De ce fait, lancer une activité puis fermer le tiroir n'est pas non plus une option. Fermer le tiroir et lancer l'activité en même temps fera bégayer l'animation de fermeture.
Étant donné que je veux d'abord le fermer en douceur, puis lancer l'activité, j'ai un problème de latence entre le moment où un utilisateur clique sur l'élément du tiroir et celui où il voit l'activité à laquelle il voulait accéder.
Voici à quoi ressemble l'écouteur de clics pour chaque élément.
final View.OnClickListener mainItemClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
mViewToLaunch = v;
mDrawerLayout.closeDrawers();
}
};
Mon activité est également le DrawerListener, son onDrawerClosed
ressemble à une méthode :
@Override
public synchronized void onDrawerClosed(final View view) {
if (mViewToLaunch != null) {
onDrawerItemSelection(mViewToLaunch);
mViewToLaunch = null;
}
}
onDrawerItemSelection
lance simplement l'une des cinq activités.
Je ne fais rien sur onPause
de la DrawerActivity
.
Je l'instrumente et il faut en moyenne 500-650 ms entre le moment où onClick est appelé et celui où onDrawerClosed se termine.
Il y a un décalage notable, une fois que le tiroir se ferme, avant que l'activité correspondante ne soit lancée.
Je réalise que plusieurs choses se passent :
-
L'animation de fermeture a lieu, ce qui représente quelques millisecondes (disons 300).
-
Ensuite, il y a probablement une certaine latence entre la fermeture visuelle du tiroir et le déclenchement de son écouteur. J'essaie de comprendre exactement ce qui se passe. en regardant
DrawerLayout
source mais je n'ai pas encore trouvé la solution. -
Ensuite, il y a le temps nécessaire à l'activité lancée pour exécuter ses méthodes du cycle de vie de démarrage jusqu'à, et y compris,
onResume
. Je ne l'ai pas encore instrumenté mais je l'estime à environ 200-300ms.
Il s'agit d'un problème pour lequel il serait très coûteux de faire fausse route. Je veux donc être sûr de bien le comprendre.
Une solution consiste à sauter l'animation de fermeture, mais j'espérais pouvoir la conserver.
Comment puis-je réduire autant que possible le temps de transition ?