【问题标题】:Hamburger to arrow animation not working programmatically汉堡到箭头动画不能以编程方式工作
【发布时间】:2017-06-11 18:18:20
【问题描述】:

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

  • 主目录:
    1. 默认状态为汉堡图标。
    2. 将在单击汉堡包或滑动手势时滑动导航抽屉。
    3. 状态改变或滑动抽屉时汉堡包的动画。
    4. 选择目录时Hamburger to Back 图标的动画。
  • 任何子目录:
    1. 上一个动画的后退按钮,其唯一目的是转到父目录。
    2. 会以滑动手势滑动导航抽屉。
    3. 当抽屉通过手势滑动或进入该目录的另一个子目录时,状态改变或后退图标动画。
    4. 使用返回图标或onBackPressed返回主目录时的返回箭头到汉堡图标的动画。

我可以使用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();

为了在从主目录和子目录来回浏览时在汉堡包和后退图标之间进行适当的切换,我使用了this answer(代码如下)作为参考,并且能够成功实现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;
    }
}

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

【问题讨论】:

  • 您是开始一个新的活动来显示子目录还是与新片段相同的活动?
  • @Dibzmania 相同的活动。我只是在上面更新了 GridView(带有图像 + 文本的自定义),我没有在这个项目中使用任何类型的 Fragment。我只是将 Internet 上的片段加上有用的文档放在一起,并在了解解决方案并将其更新到我的要求后使其工作。不过,我刚刚解决了它,并且我已经更新了答案以供将来参考。

标签: java android toolbar hamburger-menu


【解决方案1】:

如果您只是创建一个新项目,添加一个活动并使用模板NavigationDrawer(如果您使用 Android Studio。否则下载this repo),您可以看到导航抽屉活动的工作示例

当我想学习新的布局时,我只需加载模板,然后更改个别代码,直到获得我想要的。通过这种方式,您可以看到什么是什么,当您删除某些行时什么停止工作以及应该如何完成。

【讨论】:

    【解决方案2】:

    我终于能够解决它,在使用 Android Studio 的默认 NavigationBarActivity 进行修补后,我更深入地了解了 ActionBarDrawerToggle 的行为。

    • mDrawerToggle 中的onDrawerSlide 被覆盖以阻止滑动抽屉的汉堡动画,这也是最初在动画函数中阻止汉堡到箭头动画的原因。请注意两段不同代码中的这两行(之前没有包含,但您明白了):

      @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 函数,但是,滑动抽屉汉堡到箭头的动画也会回来。

    反解决方案: 我还发现汉堡包到箭头的滑动抽屉动画是由于这条线:mDrawerLayout.setDrawerListener(mDrawerToggle) 这又是一个不推荐使用的功能。所以我只是注释掉了这一行,一切都按预期工作。

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 2015-01-22
      • 1970-01-01
      • 2018-03-26
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多