在setDisplayHomeAsUpEnabled中将抽屉图标动画转换为箭头?

19

我正在使用setDisplayHomeAsUpEnabled来显示箭头而不是侧拉菜单的“汉堡包”图标,但它没有进行任何动画。相反,它瞬间显示箭头可绘制对象。

主屏幕:(Album 1)

当你点击一部电影时:(Album 2)

问题在于,当我滑动抽屉的时候,图标的动画效果很好,这让我想到也许我不应该使用setDisplayHomeAsUpEnabled来做到这一点:(Album 3)

相册: http://imgur.com/a/LkXbh

这是我的抽屉开关代码:

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    drawerAdapter = new DrawerAdapter(this, App.getNavItems(), getSupportFragmentManager());
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerList = (ExpandableListView) findViewById(R.id.left_drawer);

    // Set onGroupClick and onChildClick
    drawerAdapter.setClickEvents(MainActivity.this, drawerLayout, drawerList);
    drawerList.setAdapter(drawerAdapter);

    ActionBarDrawerToggle toolbarDrawerToggle = new ActionBarDrawerToggle(
            this,                 
            drawerLayout,        
            toolbar,             
            R.string.drawer_open, 
            R.string.drawer_close 
    ) {

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

        public void onDrawerOpened(View view) {
            super.onDrawerOpened(view);
            invalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(toolbarDrawerToggle);
    toolbarDrawerToggle.syncState();

编辑: 我希望动画不是在打开抽屉时触发,这已经可以了。我想在加载特定片段时手动触发动画。也许我没有正确地解释清楚。

3个回答

79

我没有测试过这个方法,但您可能可以通过在0(抽屉关闭)和1(抽屉打开)之间动画浮动值,然后将该值传递给ActionBarDrawerToggle.onDrawerSlide(View, float)来实现此目的。我相信这就是切换按钮确定动画切换状态的方式。

类似以下代码应该有效。

ValueAnimator anim = ValueAnimator.ofFloat(start, end);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float slideOffset = (Float) valueAnimator.getAnimatedValue();
        toolbarDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    }
});
anim.setInterpolator(new DecelerateInterpolator());
// You can change this duration to more closely match that of the default animation.
anim.setDuration(500);
anim.start();

22
抱歉,我的声望不足以进行该操作,需要15点声望。 - Vextil
6
这个方法完美地运作。只需将 start 设为 0,end 设为 1,即可从汉堡包图标切换到箭头图标;将 start 设为 1,end 设为 0,即可从箭头图标切换到汉堡包图标。值得注意的是,在箭头图标显示时抽屉关闭后,汉堡包图标会被显示出来(因为抽屉滑动的缘故),你需要进行修复。 - Raveesh Bhalla
这对我来说就是这样了。谢谢。 - Sotti
非常好用。谢谢。 - Tejas Sherdiwala
3
当使用 setDisplayHomeAsUpEnabled(false) 从后退按钮切换到汉堡菜单时,这个方法是有效的,但反过来却不行,即使我交换了0、1、start、end的位置。你有任何想法如何解决这个问题吗? - Eurig Jones
显示剩余3条评论

21

自从问这个问题之后,现在有一种替代的方法可供使用。动画箭头是通过现在公共类DrawerArrowDrawable实现的,该类实现了Drawable接口。

在您的代码中,将导航图标设置如下:

DrawerArrowDrawable drawerArrow = new DrawerArrowDrawable(this);
drawerArrow.setColor(myColor);

toolbar.setNavigationIcon(drawerArrow);

注册一个OnBackStackChangedListener并手动动画箭头:

@Override
public void onBackStackChanged() {
    boolean drawer = getSupportFragmentManager().getBackStackEntryCount() == 0;
    ObjectAnimator.ofFloat(drawerArrow, "progress", drawer ? 0 : 1).start();
}

哪个类具有onBackStackChanged()方法? - Javier Delgado
接口 OnBackStackChangedListener 具有该方法:http://developer.android.com/intl/es/reference/android/app/FragmentManager.OnBackStackChangedListener.html 与 http://developer.android.com/intl/es/reference/android/app/FragmentManager.html#addOnBackStackChangedListener(android.app.FragmentManager.OnBackStackChangedListener) 一起使用。 - Kirill Rakhman
在这种情况下,“drawer”是什么? - jlively
1
@jlively 所需的所有代码都已包含。boolean drawer 表示 drawable 是否应显示汉堡包图标或返回箭头图标。 - Kirill Rakhman

0

听起来它正在按预期工作,你可以使用 setDisplayHomeAsUpEnabled 来简单地启用主页按钮作为返回按钮,没有动画。

如果你正在使用导航抽屉并且想要动画效果,请不要使用 setDisplayHomeAsUpEnabled,对于 Material 主题(至少在 AppCompat v21 中),请确保使用来自 v7 包的 ActionBarDrawerToggle

Play 商店是一个很好的例子。在顶级中,你有一个带有导航抽屉和汉堡菜单的活动,在打开抽屉时会有动画效果。如果你点击一个应用程序,它会打开一个新的活动,其中有一个返回箭头。


在这种情况下,您可以使用 setDisplayHomeAsUpEnabled(true),这样您将获得一个返回箭头而不是汉堡包图标,但如果您仍然保持导航抽屉处于活动状态,那么我认为这并不是它的预期工作方式。如果您检查已更新到材料主题的Google应用程序,则不会找到任何带有返回箭头和活动导航抽屉的屏幕。 - Philio
没错,我明白当有箭头时用户不期望出现抽屉。但我的想法是锁定抽屉并显示返回箭头,因为我想避免创建一个新的活动,这样可以使用新的动画API将电影海报从上一个片段过渡到新的片段,并平滑地更改工具栏背景颜色。 - Vextil
2
@Philio:“如果你检查已更新为材料主题的Google应用程序,你不会找到任何带有返回箭头和活动导航抽屉的屏幕。”这是明显错误的。点击Play商店中的应用程序以打开其详细信息活动:返回箭头将显示,但您仍然可以在导航抽屉中滑动。Joaquin正在询问如何手动触发汉堡包->箭头动画。 - Nathan Walters
啊,我明白你的意思了。我不知道有没有一种方法可以将汉堡包动画变成一个返回箭头。 - Philio
@Philio,这对我在Play Games、Play Store和Play Music上都有效。你运行的是哪个版本的Android? - Nathan Walters
显示剩余5条评论

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