我想手动将抽屉图标从汉堡设置为箭头,反之亦然,不仅在拖动抽屉时,是否可以?我正在使用支持库appcompat-v7:21。
此外,我无法找到android.support.v7.app.ActionBarDrawerToggle的源代码,这将有所帮助。
答案 0 :(得分:13)
我找到了一种使用简单的ValueAnimator和.onDrawerSlide
方法为图标设置动画的方法。
ValueAnimator anim = ValueAnimator.ofFloat(start, end);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float slideOffset = (Float) valueAnimator.getAnimatedValue();
drawerToggle.onDrawerSlide(drawerLayout, slideOffset);
}
});
anim.setInterpolator(new DecelerateInterpolator());
anim.setDuration(300);
anim.start();
但也许有更好的解决方案。
答案 1 :(得分:4)
// define your drawer layout
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// define your actionbar toggle
final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
// Pass in context
this,
// Pass in your drawer layout
drawerLayout,
// Pass a String resource to describe the "open drawer" action for accessibility
R.string.open_drawer,
// Pass a String resource to describe the "close drawer" action for accessibility
R.string.close_drawer
);
// add a drawerListener to your drawer layout
drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
// Here's where the animation happens.
// the provided float starts at 0 (drawer closed) and goes to 1 (drawer open) hitting all points in between.
// ActionBarDrawerToggle has an onDrawerSlide method that takes your drawer layout and the provided float from the onDrawerSlide constructor.
// By passing the slideOffSet from the drawer's OnDrawerSlide method into the toggle, it maps the animation to the provided float.
toggle.onDrawerSlide(drawerView, slideOffset);
}
@Override
public void onDrawerOpened(View view) {
}
@Override
public void onDrawerClosed(View view) {
}
@Override
public void onDrawerStateChanged(int i) {
}
});
编辑:上面的内容会有效,但我找到了更优雅的方法。通过将切换设置为抽屉的侦听器,默认情况下处理状态。见下文:
// define your drawer layout
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// define your actionbar drawertoggle
drawerToggle = new ActionBarDrawerToggle(
// Pass in context
this,
// Pass in your drawer layout
drawerLayout,
// Attach the toolbar
toolbar,
// Pass a String resource to describe the "open drawer" action for accessibility
R.string.open_drawer,
// Pass a String resource to describe the "close drawer" action for accessibility
R.string.close_drawer
) {
// attach drawer listener states to the ActionBarDrawerToggle
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
}
};
drawerLayout.setDrawerListener(drawerToggle);
drawerToggle.syncState();