我正在使用setDisplayHomeAsUpEnabled来显示箭头而不是抽屉“汉堡”图标,但它没有动画或任何东西。相反,它会立即显示箭头。
主屏幕:(相册1)
点按电影时:(相册2)
问题是,当我滑动抽屉时,图标会使动画很好,这让我觉得我可能不应该使用setDisplayHomeAsUpEnabled:(相册3)
这是我的抽屉切换代码:
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();
编辑:我希望动画不是在打开抽屉时,已经有效了。 我想在加载特定片段时手动触发动画。我可能没有正确解释自己。
答案 0 :(得分:77)
我没有对此进行测试,但您可以通过在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();
答案 1 :(得分:19)
自提出问题以来,已有另一种方法可供使用。动画箭头由实现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();
}
答案 2 :(得分:0)
听起来它按预期工作,您可以使用setDisplayHomeAsUpEnabled
简单地将主页按钮用作后退按钮,没有动画。
如果您正在使用导航抽屉并希望动画不使用setDisplayHomeAsUpEnabled
,并且想要使用材质主题(至少使用AppCompat v21),请确保使用v7包中的ActionBarDrawerToggle
。< / p>
Play商店就是一个很好的例子。在顶层,您有一个带有导航抽屉和汉堡包的活动,当您打开抽屉时,它会动画。如果您点按某个应用,则会打开一个带有后退箭头的新活动。