【问题标题】:ActionBarDrawerToggle animationActionBarDrawerToggle 动画
【发布时间】:2015-01-05 05:50:09
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案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();
    }
    

    【讨论】:

    • 究竟应该改变什么?我打开抽屉的时候还有动画,想要的时候就没有了。
    • 如果你想禁用它。将此设置为 false false
    • 这仍然显示动画,只是没有旋转条。
    • 那么你的意思是什么动画?
    • 打开抽屉式导航栏时图标根本不应该改变。它的菜单图标应该保留,因为无论如何它都被抽屉重叠了。我只想要其他情况下的动画,例如更改片段时。
    【解决方案2】:

    当您创建 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,如另一个答案中所述。
    【解决方案3】:

    我知道我迟到了……

    在活动中这样做:

    drawerToggle.setDrawerIndicatorEnabled(false);
    

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

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

    【讨论】:

      【解决方案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(),禁用动画

      【讨论】:

        【解决方案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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多