将抽屉图标动画到setDisplayHomeAsUpEnabled上的箭头?

Vex*_*til 19 animation android toggle drawer

我正在使用setDisplayHomeAsUpEnabled来显示箭头而不是抽屉"汉堡"图标,但它没有动画或任何东西.相反,它立即显示箭头可绘制.

主屏幕:( 专辑1)

点按电影时:( 专辑2)

问题是,当我滑动抽屉时,图标会使动画很好,这让我想到也许我不应该使用setDisplayHomeAsUpEnabled :( 专辑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();
Run Code Online (Sandbox Code Playgroud)

编辑:我想要的动画不是在打开抽屉时,已经有效了.我想在加载特定片段时手动触发动画.我可能没有正确解释自己.

Nat*_*ers 78

我没有对此进行测试,但您可以通过在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();
Run Code Online (Sandbox Code Playgroud)

  • 我不能,我需要15声誉对不起:( (21认同)
  • 这非常有效.只需将start = 0和end = 1设置为从汉堡包转到箭头,然后将start = 1和end = 0设置为箭头转换为汉堡包.您需要跟踪的一件事是当箭头显示时抽屉关闭.此时,汉堡包最终被显示(因为抽屉的滑动),你必须纠正. (6认同)
  • @NathanWalters当使用setDisplayHomeAsUpEnabled(false)从后退按钮转到汉堡包时,这是有效的,但即使我交换0,1开始,结束,它也无法正常工作.知道如何做到这一点? (3认同)

Kir*_*man 20

自提出问题以来,已有另一种方法可供使用.动画箭头由现在实现的公共类DrawerArrowDrawable实现Drawable.

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

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

toolbar.setNavigationIcon(drawerArrow);
Run Code Online (Sandbox Code Playgroud)

OnBackStackChangedListener手动注册箭头并为其设置动画:

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