禁用汉堡包以在工具栏上支持箭头动画

tom*_*ozb 29 android material-design android-toolbar

Toolbar使用汉堡包实现背箭头动画非常容易.在我看来这个动画是没有意义的,因为根据材料设计规格导航抽屉覆盖了Toolbar打开时.我的问题是如何正确禁用此动画并显示汉堡包或后退箭头使用getSupportActionBar().setDisplayHomeAsUpEnabled(true);

这就是我做的方式,但它看起来像一个肮脏的黑客:

mDrawerToggle.setDrawerIndicatorEnabled(false);

if (showHomeAsUp) {
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.lib_ic_arrow_back_light);
    mDrawerToggle.setToolbarNavigationClickListener(view -> finish());
} else {
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.lib_ic_menu_light);
    mDrawerToggle.setToolbarNavigationClickListener(view -> toggleDrawer());
}
Run Code Online (Sandbox Code Playgroud)

如何才能正确实施这一点,setDisplayHomeAsUpEnabled以便在汉堡包和后箭头图标之间切换?

Fra*_*ank 48

这将禁用动画,在创建drawerToggle时,覆盖onDrawerSlide():

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);
    }

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

如果要完全删除箭头,可以添加

 super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state
Run Code Online (Sandbox Code Playgroud)

在onDrawerOpened函数的末尾.

  • 可悲的是,这可能是真的.我只在没有使用汉堡的地方使用homeasup. (2认同)
  • 你也可以通过注释`super.onDrawerOpened(drawerView);`而不是在onDrawerOpened函数的末尾添加`super.onDrawerSlide(drawerView,0);`来完全删除箭头. (2认同)

adn*_*eal 12

在我看来这个动画毫无意义

嗯,ActionBarDrawerToggle意思是动画.

来自文档:

您可以通过在ActionBar主题中定义drawerArrowStyle来自定义动画切换.

任何线索如何正确实现只使用setDisplayHomeAsUpEnabled在汉堡包和后箭头图标之间切换?

这ActionBarDrawerToggle只是一种奇特的召唤方式ActionBar.setHomeAsUpIndicator.所以,你会无论哪种方式有打电话ActionBar.setDisplayHomeAsUpEnabled来true,以显示它.

如果你确信你必须使用它,那么我建议分别打电话ActionBarDrawerToggle.onDrawerOpened(View drawerView)和ActionBarDrawerToggle.onDrawerClosed(View drawerView).

这将把DrawerIndicator位置设置为1或0在箭头和汉堡包状态之间切换DrawerArrowDrawable.

在你的情况下,甚至没有必要附加ActionBarDrawerToggle一个DrawerLayout.DrawerListener.如:

mYourDrawer.setDrawerListener(mYourDrawerToggle);
Run Code Online (Sandbox Code Playgroud)

但更有前瞻性的方法是拨打ActionBar.setHomeAsUpIndicator一次并使用自己的汉堡图标,你也可以通过一种风格来做.然后,当您想要显示后退箭头时,只需调用ActionBar.setDisplayHomeAsUpEnabled并让AppCompat或框架处理其余部分.根据你的评论,我很确定这就是你要找的东西.

如果你不能确定要使用的图标,默认DrawerArrowDrawable大小是24dp的,这意味着你要抢的ic_menu_white_24dp还是ic_menu_black_24dp从设置导航图标在谷歌官方的材料设计图标包.

您也可以将其复制DrawerArrowDrawable到项目中,然后根据需要切换箭头或汉堡状态.它是自包含的,减去一些资源.

  • 也许ActionBarDrawerToggle是动画的,但如果您查看符合材料设计规则的Google应用程序,则会禁用此动画.我需要抽屉听众,因为当抽屉打开/关闭时,动作按钮的可见性必须改变.我已经在使用ic_menu_white_24dp资源(只是名称不同).如果您设置自己的资源图标,则setDisplayHomeAsUpEnabled方法将不再起作用.要显示后退箭头,我必须将图标交换到lib_ic_arrow_back_light.对不起,但在看完你的答案后,我仍然不知道哪个参数设置为真或假 (3认同)

Nik*_*ski 1

禁用方法中的超级调用onDrawerSlide()将停止 Arrow 和 Burger 之间的动画。仅当抽屉完全打开或完全关闭时,您才会看到切换(无动画)。

mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.closed) {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                  //super.onDrawerSlide(drawerView, slideOffset);
            }
        };
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
Run Code Online (Sandbox Code Playgroud)