web-dev-qa-db-fra.com

Animer l'icône du tiroir dans la flèche sur setDisplayHomeAsUpEnabled?

J'utilise setDisplayHomeAsUpEnabled afin d'afficher la flèche au lieu de l'icône "burger" du tiroir, mais cela ne s'anime pas ou quoi que ce soit. Au lieu de cela, il montre la flèche tirable instantanément.

Écran d'accueil: (Album 1)

Lorsque vous appuyez sur un film: (Album 2)

Le fait est que l'icône fait très bien l'animation lorsque je fais glisser le tiroir, ce qui me fait penser que je ne suis peut-être pas censé utiliser setDisplayHomeAsUpEnabled pour cela: (Album 3)

Album: http://imgur.com/a/LkXbh

Voici mon code de bascule de tiroir:

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    drawerAdapter = new DrawerAdapter(this, App.getNavItems(), getSupportFragmentManager());
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerList = (ExpandableListView) findViewById(R.id.left_drawer);

    // Set onGroupClick and onChildClick
    drawerAdapter.setClickEvents(MainActivity.this, drawerLayout, drawerList);
    drawerList.setAdapter(drawerAdapter);

    ActionBarDrawerToggle toolbarDrawerToggle = new ActionBarDrawerToggle(
            this,                 
            drawerLayout,        
            toolbar,             
            R.string.drawer_open, 
            R.string.drawer_close 
    ) {

        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View view) {
            super.onDrawerOpened(view);
            invalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(toolbarDrawerToggle);
    toolbarDrawerToggle.syncState();

EDIT: Je ne veux pas l'animation lors de l'ouverture du tiroir, cela fonctionne déjà. Je voudrais déclencher manuellement l'animation lorsque je charge un fragment spécifique. Je ne me suis peut-être pas expliqué correctement.

19
Vextil

Je n'ai pas testé cela, mais vous pouvez y parvenir en animant un flottant entre 0 (tiroir fermé) et 1 (tiroir ouvert), puis en passant la valeur dans ActionBarDrawerToggle.onDrawerSlide(View, float). Je crois que c'est ainsi que la bascule détermine dans quel état la bascule animée doit être.

Quelque chose comme ça devrait fonctionner.

ValueAnimator anim = ValueAnimator.ofFloat(start, end);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float slideOffset = (Float) valueAnimator.getAnimatedValue();
        toolbarDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    }
});
anim.setInterpolator(new DecelerateInterpolator());
// You can change this duration to more closely match that of the default animation.
anim.setDuration(500);
anim.start();
78
Nathan Walters

Depuis que la question a été posée, un autre moyen est devenu disponible. La flèche animée est implémentée par la classe désormais publique DrawerArrowDrawable qui implémente Drawable.

Dans votre code, définissez l'icône de navigation comme suit:

DrawerArrowDrawable drawerArrow = new DrawerArrowDrawable(this);
drawerArrow.setColor(myColor);

toolbar.setNavigationIcon(drawerArrow);

Enregistrez un OnBackStackChangedListener et animez la flèche manuellement:

@Override
public void onBackStackChanged() {
    boolean drawer = getSupportFragmentManager().getBackStackEntryCount() == 0;
    ObjectAnimator.ofFloat(drawerArrow, "progress", drawer ? 0 : 1).start();
}
20
Kirill Rakhman

On dirait que cela fonctionne comme prévu, vous pouvez utiliser setDisplayHomeAsUpEnabled pour simplement activer le bouton d'accueil comme bouton de retour, il n'y a pas d'animation.

Si vous utilisez un tiroir de navigation et que vous souhaitez que l'animation n'utilise pas setDisplayHomeAsUpEnabled et pour le thème du matériau (au moins avec AppCompat v21) assurez-vous d'utiliser ActionBarDrawerToggle du package v7.

Le Play Store en est un bon exemple. Au niveau supérieur, vous avez une activité avec un tiroir de navigation et un hamburger qui s'anime lorsque vous ouvrez le tiroir. Si vous appuyez sur une application, une nouvelle activité s'ouvre avec une flèche de retour.

0
Philio