Animer l'icône de tiroir en flèche sur setDisplayHomeAsUpEnabled?

j'utilise setDisplayHomeAsUpEnabled pour montrer la flèche à la place du tiroir "burger" icône, mais il ne devient pas animé ou quoi que ce soit. Au lieu de cela il montre la flèche dessinable instantanément.

écran d'Accueil: (Album 1)

Lorsque vous appuyez sur une vidéo: (Album 2)

Le truc c'est que l'icône fait très bien l'animation quand je glisse dans le tiroir, ce qui me fait penser que peut-être Je ne suis pas censé utiliser setDisplayHomeAsUpEnabled for this: (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 de l'animation en ouvrant le tiroir, ça marche déjà. J'aimerais déclencher l'animation manuellement lorsque je charge un fragment spécifique. Je ne me suis peut-être pas expliqué correctement.

19
demandé sur Bhargav Rao 2014-10-26 22:29:20

3 réponses

Je ne l'ai pas testé, mais vous pouvez y arriver en animant un flotteur entre 0 (tiroir fermé) et 1 (tiroir ouvert) et en passant la valeur dans ActionBarDrawerToggle.onDrawerSlide(View, float). Je crois que c'est comme ça que la bascule détermine dans quel état la bascule animée doit être.

quelque chose comme ça devrait marcher.

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();
74
répondu Nathan Walters 2014-10-26 20:15:37

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 maintenant publique DrawerArrowDrawable qui met en oeuvre Drawable.

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

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

toolbar.setNavigationIcon(drawerArrow);

enregistrer un OnBackStackChangedListener et animer la flèche manuellement:

@Override
public void onBackStackChanged() {
    boolean drawer = getSupportFragmentManager().getBackStackEntryCount() == 0;
    ObjectAnimator.ofFloat(drawerArrow, "progress", drawer ? 0 : 1).start();
}
19
répondu Kirill Rakhman 2016-01-22 16:28:44

on dirait que ça fonctionne comme prévu, vous pouvez utiliser setDisplayHomeAsUpEnabled pour permettre simplement l'utilisation du bouton home comme bouton back, il n'y a pas d'animation.

si vous utilisez un tiroir de navigation et que vous voulez l'animation n'utilisez pas setDisplayHomeAsUpEnabled et pour le matériel de thème (au moins avec AppCompat v21) assurez-vous que vous utilisez ActionBarDrawerToggle du paquet v7.

Le Play Store est un bon exemple. Au premier niveau vous avez une activité avec un nav tiroir et un hamburger qui anime lorsque vous ouvrez le tiroir. Si vous appuyez sur une application il ouvre une nouvelle activité qui a une flèche arrière.

0
répondu Philio 2014-10-26 19:46:13