ActionBarDrawerToggle动画

11

我在我的应用程序中使用来自v7 appcompat库的ActionBarDrawerToggle,并且在菜单转换为箭头动画方面遇到了一些问题。 根据Material Design准则,导航抽屉应重叠在工具栏上,当打开抽屉时不应使用图标动画。

为什么打开/关闭导航抽屉时默认启用动画,如何禁用它?

另外,如何触发其他事件时的动画?我找到了这个解决方案,但它仅适用于Android API 11+,并且通过调用setDrawerIndicatorEnabled(false)或工具栏中扩展的ActionView被覆盖。

5个回答

16

当您创建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 
        }
    };

实际上,你只需要重写onDrawer*()方法而不调用它们的super方法。不需要额外的super.onDrawerSlide(drawerView, 0);调用。如果你没有在其他地方使用这些覆盖,也就是说,如果它们只是空的,那么你可以不将切换设置为DrawerListener,正如另一个答案中提到的那样。 - Mike M.

4

我今天遇到了这个问题,并找到了一个简单而且(我相信)是合适的解决方案:

不要将ActionBarDrawerToggle实例设置为DrawerLayout的DrawerListener。这样,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);
        }
    };

如果使用0值而不是slideOffset调用super.onDrawerSlide(),则会禁用动画效果。


1
我知道我来晚了...
在活动中完成以下操作:
drawerToggle.setDrawerIndicatorEnabled(false);

在 styles.xml 主题中。做这个:
<item name="android:homeAsUpIndicator">@drawable/menu_icon</item>

1
在您的主题中添加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();
}

那个具体应该改变什么?当我打开抽屉时,动画还在,但是当我想要它时却没有。 - Makru
1
如果您想禁用它,请将其设置为false <item name="spinBars">false</item>。 - AruLNadhaN
那仍然显示动画,只是没有旋转的条形图。 - Makru
那么你指的是什么动画? - AruLNadhaN
2
当打开导航抽屉时,图标不应该改变。菜单图标应该保持不变,因为它已经被抽屉覆盖了。我只想在其他情况下进行动画,比如切换片段时。 - Makru
这里也有同样的问题。我无法停止图标的动画,它总是在做某些事情。根据Android指南,导航抽屉覆盖了除状态栏以外的所有东西,所以动画对我来说毫无意义。怎么停止它?? - Sotti

0
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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接