Android 将抽屉图标动画化为setDisplayHomeAsUpEnabled上的箭头?

Android 将抽屉图标动画化为setDisplayHomeAsUpEnabled上的箭头?,android,animation,toggle,drawer,Android,Animation,Toggle,Drawer,我使用setDisplayHomeAsUpEnabled来显示箭头,而不是抽屉中的“汉堡”图标,但它没有得到动画或任何东西。相反,它显示了可即时绘制的箭头 主屏幕:(专辑1) 点击电影时:(相册2) 问题是,当我滑动抽屉时,图标的动画效果很好,这让我觉得也许我不应该使用SetDisplayHome来实现这一点:(专辑3) 专辑: 这是我的抽屉开关代码: 编辑:我不希望在打开抽屉时播放动画,因为动画已经开始工作了。 我想在加载特定片段时手动触发动画。我可能没有正确地解释自己。听起来像是按预期工作

我使用setDisplayHomeAsUpEnabled来显示箭头,而不是抽屉中的“汉堡”图标,但它没有得到动画或任何东西。相反,它显示了可即时绘制的箭头

主屏幕:(专辑1)

点击电影时:(相册2)

问题是,当我滑动抽屉时,图标的动画效果很好,这让我觉得也许我不应该使用SetDisplayHome来实现这一点:(专辑3)

专辑:

这是我的抽屉开关代码:

编辑:我不希望在打开抽屉时播放动画,因为动画已经开始工作了。
我想在加载特定片段时手动触发动画。我可能没有正确地解释自己。

听起来像是按预期工作,您可以使用
setDisplayHomeAsUpEnabled
简单地启用home按钮作为后退按钮,没有动画

如果您使用的是导航抽屉,并且希望动画不使用
setDisplayHomeAsUpEnabled
,对于材质主题(至少对于AppCompat v21),请确保使用v7软件包中的
ActionBarDrawerToggle


游戏商店就是一个很好的例子。在顶层,您有一个活动,其中有一个导航抽屉和一个汉堡包,当您打开抽屉时,它会产生动画。如果你点击一个应用程序,它会打开一个带有返回箭头的新活动。

我还没有测试过这个,但是你可以通过在0(抽屉关闭)和1(抽屉打开)之间设置浮动动画,然后将值传递到
ActionBarDrawerToggle.onDrawerSlide(视图,浮动)
中来实现。我相信这就是切换如何决定动画切换应处于的状态

这样的办法应该行得通

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

自从有人提出这个问题以来,已经有了另一种方法。动画箭头由现在的公共类
drawerarrowdawable
实现,该类实现了
draawable

在代码中,按如下方式设置导航图标:

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

toolbar.setNavigationIcon(drawerArrow);
在BackbackChangedListener上注册
并手动设置箭头动画:

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

我有材料主题,ActionBarDrawerToggle是v7中的一个。有没有办法将图标更改为箭头,然后通过编程将其设置为动画?我希望动画不是在打开抽屉的时候,那已经可以工作了。我想在加载特定片段时手动触发动画。我可能没有正确地解释我自己。在这种情况下,你可以使用
setDisplayHomeAsUpEnabled(true)
,你会得到一个返回箭头而不是一个汉堡包,但是如果你仍然有导航抽屉处于活动状态,那么我认为这并不是它真正想要的工作方式。如果您检查已更新为材料主题的谷歌应用程序,您将找不到任何带有后退箭头和活动导航抽屉的屏幕。从用户体验的角度来看,用户期望:有一个汉堡=有一个导航抽屉。有一个返回箭头=返回到上一个屏幕。这是真的,我知道当有箭头时,用户不希望有抽屉。问题是,我的想法是锁定抽屉并显示一个后箭头,因为我想避免创建一个新的活动,该活动允许我使用新的动画API将电影海报从以前的片段转换为新的片段,并平滑地更改工具栏背景色。@Philio“如果你查看已更新为材料主题的谷歌应用程序,你将找不到任何带有后退箭头和活动导航抽屉的屏幕。“这显然是错误的。单击Play Store中的某个应用打开其详细信息活动:显示后退箭头,但您仍可以在导航抽屉中滑动。Joaquin正在询问如何手动触发hamburger->arrow动画。我不能,我需要15分钟。对不起:(这非常有效。只需将start=0和end=1设置为从汉堡到箭头,将start=1和end=0设置为从箭头到汉堡。您需要跟踪的一件事是,当箭头显示时,抽屉何时关闭。此时,汉堡最终显示出来(因为抽屉滑动),这一点您必须纠正。当您单击图标打开和关闭它时,这一点非常有效。当您滑动抽屉打开或关闭它时,它也会起作用。但是,我错过的是滑动抽屉时显示的效果,即转换。我如何复制它?在这里您可以看到汉堡到箭头之间的转换,在这里实现您的解决方案@russellhoff之后,如果您将其作为一个新问题与您的一些代码一起发布,我可能能够帮助您。@NathanWalters在使用setDisplayHomeAsUpEnabled(false)时从“返回”按钮转到“汉堡包”时,这一点很有效,但即使我交换0,1 start,end,它也不起作用。知道怎么做吗?哪个类的onbackbackchanged()发生了变化方法?界面
onbackbackbackchangedListener
有这样一种方法:在这种情况下与
drawer
一起使用?@jl通常包括所有必需的代码。
boolean drawer
指示可提取文件应该显示汉堡还是返回箭头。
@Override
public void onBackStackChanged() {
    boolean drawer = getSupportFragmentManager().getBackStackEntryCount() == 0;
    ObjectAnimator.ofFloat(drawerArrow, "progress", drawer ? 0 : 1).start();
}