汉堡包到箭头动画无法以编程方式工作

Hamburger to arrow animation not working programmatically

我制作了一个服务器目录浏览应用程序,可以更改 Activity 本身的内容。我一直在添加一个功能:Navigation Drawer 并按如下方式处理 HamburgerBack 图标:

我可以使用 this answer 获得汉堡包返回图标的动画(代码逐字使用如下)但是当回到主目录时无法再次获得汉堡包图标(没有包含该代码,而是采用了下一部分的另一种方法)

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float slideOffset = (Float) valueAnimator.getAnimatedValue();
        mDrawerToggle.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();

为了在从主目录和子目录来回浏览时在汉堡包和后退图标之间进行适当的切换,我使用了 (逐字代码如下)作为参考,并且能够成功实现 1、2 和 3 主目录和子目录的功能。

private void enableViews(boolean enable) {

    if(enable) {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        getSupportActionBar().setHomeButtonEnabled(true); // comment this line of code

        if(!mToolBarNavigationListenerIsRegistered) {
            mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Doesn't have to be onBackPressed
                    onBackPressed();
                }
            });
            mToolBarNavigationListenerIsRegistered = true;
        }
    }
    else {
        // Remove back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setHomeButtonEnabled(false); // comment this line of code

        // Show hamburger
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        // Remove the/any drawer toggle listener
        mDrawerToggle.setToolbarNavigationClickListener(null);
        mToolBarNavigationListenerIsRegistered = false;
    }
}

关于手头的问题是:在浏览目录时,从汉堡图标到返回图标来回切换,动画部分根本不起作用。但是这两个图标的状态及其功能都已成功更改。如果您需要更多信息来进行故障排除,请告诉我。

你可以看到导航抽屉的工作示例activity如果你只是创建一个新项目,添加一个activity并使用模板NavigationDrawer (if you use Android Studio. Otherwise download this repo)

当我想学习新的布局时,我只需加载模板,然后更改个别代码片段,直到获得我想要的内容。这样你就可以看到什么做了什么,当你删除一些行时什么停止工作以及应该如何完成。

我终于能够解决它,在使用 Android studio 的默认 NavigationBarActivity 修改它之后,以更深入的方式了解了 ActionBarDrawerToggle 的行为。

  • 滑动抽屉对 mDrawerToggleonDrawerSlide 的覆盖以阻止汉堡包的动画是导致汉堡包动画同样阻止箭头中的箭头的原因首先是动画功能。请注意来自两段不同代码的这两行(之前没有包括它,但你明白了):

    @Override
    public void onDrawerSlide(View view, float slideOffset) {
        // blocks the animation
        super.onDrawerSlide(view, 0);
    }
    
    // from the animator function above
    mDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    

解决方案:我删除了重写的onDrawerSlide函数,但是,滑动抽屉汉堡包到箭头的动画也会回来。

Counter-Solution: 我还发现汉堡包到箭头的滑动抽屉动画是由于这一行而发生的:mDrawerLayout.setDrawerListener(mDrawerToggle) 这又是一个已弃用的功能.所以我只是注释掉了这一行,一切都按预期工作。