Анимировать значок ActionBarDrawerToggle программно

Я хочу вручную анимировать значок ящика с бургера на стрелку и наоборот, а не только при перетаскивании ящика, возможно ли это? Я использую библиотеку поддержки appcompat-v7:21.

Также я не могу найти исходный код android.support.v7.app.ActionBarDrawerToggle, который был бы полезен.


person Ivan Fork    schedule 21.10.2014    source источник


Ответы (2)


Я нашел способ анимировать значок с помощью простого метода ValueAnimator и .onDrawerSlide.

    ValueAnimator anim = ValueAnimator.ofFloat(start, end);
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float slideOffset = (Float) valueAnimator.getAnimatedValue();
            drawerToggle.onDrawerSlide(drawerLayout, slideOffset);
        }
    });
    anim.setInterpolator(new DecelerateInterpolator());
    anim.setDuration(300);
    anim.start();

Но, возможно, есть лучшее решение.

person Ivan Fork    schedule 21.10.2014
comment
Спасибо за Ваш ответ! Это отлично работает для меня, хотя я согласен, что, вероятно, есть лучшее решение. Но пока это единственное решение, которое сработало :) - person MathieuMaree; 04.11.2014

// define your drawer layout
    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    // define your actionbar toggle
    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            // Pass in context
            this,
            // Pass in your drawer layout
            drawerLayout,
            // Pass a String resource to describe the "open drawer" action for accessibility
            R.string.open_drawer,
            // Pass a String resource to describe the "close drawer" action for accessibility
            R.string.close_drawer
    );
    // add a drawerListener to your drawer layout
    drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            // Here's where the animation happens.
            // the provided float starts at 0 (drawer closed) and goes to 1 (drawer open) hitting all points in between.

            // ActionBarDrawerToggle has an onDrawerSlide method that takes your drawer layout and the provided float from the onDrawerSlide constructor.
            // By passing the slideOffSet from the drawer's OnDrawerSlide method into the toggle, it maps the animation to the provided float.
            toggle.onDrawerSlide(drawerView, slideOffset);
        }

        @Override
        public void onDrawerOpened(View view) {

        }

        @Override
        public void onDrawerClosed(View view) {

        }

        @Override
        public void onDrawerStateChanged(int i) {

        }
    });

РЕДАКТИРОВАТЬ: Вышеприведенное будет работать, но я нашел гораздо более элегантный способ сделать это. Установив переключатель в качестве прослушивателя ящика, состояния обрабатываются по умолчанию. См. ниже:

        // define your drawer layout
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    // define your actionbar drawertoggle
    drawerToggle = new ActionBarDrawerToggle(
            // Pass in context
            this,
            // Pass in your drawer layout
            drawerLayout,
            // Attach the toolbar
            toolbar,
            // Pass a String resource to describe the "open drawer" action for accessibility
            R.string.open_drawer,
            // Pass a String resource to describe the "close drawer" action for accessibility
            R.string.close_drawer
    )  {
        // attach drawer listener states to the ActionBarDrawerToggle
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
    drawerToggle.syncState();
person Psest328    schedule 23.10.2014