ActionBarDrawerToggle动画

时间:2014-11-08 14:34:46

标签: android android-actionbar navigation-drawer android-appcompat material-design

我在我的应用程序中使用v7 appcompat库中的ActionBarDrawerToggle,并且在菜单到箭头动画方面遇到了一些麻烦。 根据材料设计指南,导航抽屉应与工具栏重叠,打开抽屉时不应使用图标动画。

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

另外,如何在其他出现时触发动画?我找到了this solution,但它仅适用于Android API 11+,并且可以通过调用setDrawerIndicatorEnabled(false)或工具栏中的扩展ActionView来覆盖。

5 个答案:

答案 0 :(得分: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 
        }
    };

答案 1 :(得分: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(),禁用动画

答案 2 :(得分: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();
}

答案 3 :(得分:1)

我知道我已经很晚了......

在活动中执行此操作:

drawerToggle.setDrawerIndicatorEnabled(false);

在styles.xml主题中。这样做:

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

答案 4 :(得分: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();