Анимация ActionBarDrawerToggle

Я использую ActionBarDrawerToggle из библиотеки appcompat v7 в своем приложении и испытываю некоторые проблемы с анимацией меню в стрелку. Согласно инструкциям по проектированию материалов, навигационный ящик должен перекрывать панель инструментов, и при открытии ящика нельзя использовать анимацию значков, как я понимаю.

Почему анимация включена по умолчанию при открытии/закрытии ящика навигации и как ее отключить?

Также, как я могу запускать анимацию в других случаях? Я нашел это решение, но он работает только для Android API 11+ и перезаписывается путем вызова setDrawerIndicatorEnabled(false) или расширенного ActionView на панели инструментов.

Ответ 1

Когда вы создаете свой ActionBarDrawerToggle, сделайте это так, чтобы отключить анимацию/стрелку и всегда показывать гамбургер:

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
            getToolbar(), R.string.open, R.string.close) {

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

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, 0); // this disables the animation 
        }
    };

Ответ 2

Я столкнулся с этой проблемой и нашел простой и (верю) правильный вариант:

Просто не устанавливайте экземпляр ActionBarDrawerToggle как DrawerListener для DrawerLayout. Таким образом, ActionBarDrawerToggle не будет выполнять анимацию, которая зависит от сдвига слайдера выдвижного ящика.

Если вам нужен прослушиватель DrawerLayout, используйте DrawerLayout.DrawerListener.

изменить Вы также можете установить ActionBarDrawerToggle в качестве слушателя, но вы должны переопределить его метод onDrawerSlide. например например:

 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open_desc, R.string.drawer_close_desc) {
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, 0);
        }
    };

вызов super.onDrawerSlide() с 0 значением вместо slideOffset, отключает анимацию

Ответ 3

Добавьте DrawerArrowStyle в свою тему, как указано выше. Это делает трюк...

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

Пример активности

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
        this,  mDrawerLayout, mToolbar,
        R.string.navigation_drawer_open, R.string.navigation_drawer_close
    );
    mDrawerLayout.setDrawerListener(mDrawerToggle);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    mDrawerToggle.syncState();
}

Ответ 4

Я знаю, что я очень поздно...

Сделайте это в своей деятельности:

drawerToggle.setDrawerIndicatorEnabled(false);

В теме styles.xml. Сделайте это:

<item name="android:homeAsUpIndicator">@drawable/menu_icon</item>

Ответ 5

mDrawerToggle = new ActionBarDrawerToggle(
                this,
                mDrawerLayout,
                mToolbar,
                R.string.drawer_open,
                R.string.drawer_close
        ) {
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                invalidateOptionsMenu();
                syncState();

            }


            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                invalidateOptionsMenu();
                syncState();
                mLeftMenuFrame.bringToFront();
                mRightMenuFrame.bringToFront();

            }
        };


        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        mToolbar.inflateMenu(R.menu.menu_main);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mDrawerToggle.syncState();