从我在v7的源代码中看到的ActionBarDrawerToggle
,您可以将图标设置为不同状态的动画,而无需打开抽屉。
private enum ActionDrawableState{
BURGER, ARROW
}
private static void toggleActionBarIcon(ActionDrawableState state, final ActionBarDrawerToggle toggle, boolean animate){
if(animate) {
float start = state == ActionDrawableState.BURGER ? 0f : 1.0f;
float end = Math.abs(start - 1);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end);
offsetAnimator.setDuration(300);
offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float offset = (Float) animation.getAnimatedValue();
toggle.onDrawerSlide(null, offset);
}
});
offsetAnimator.start();
}else{
//do the same with nine-old-androids lib :)
}
}else{
if(state == ActionDrawableState.BURGER){
toggle.onDrawerClosed(null);
}else{
toggle.onDrawerOpened(null);
}
}
}
Burger 和 Arrow 之间的变形取决于之间的值0f
and 1.0f
,基本上这些是抽屉传递给 ActionBarDrawerToggle 的值。
I used ValueAnimator
为该范围内的值设置动画,即模仿抽屉切换。
null
争论是安全的,因为ActionBarDrawerToggle
根本不关心抽屉视图。
确保您查看新的插值器来完全按照材料设计指南的书来制作动画:
fast_out_linear_in
fast_out_slow_in
另一种方法是访问mSlider
的私人领域ActionBarDrawer
通过反思和呼唤setPosition(float position)
在 Burger 和 Arrow 之间切换的方法。mSlider
属于类型(扩展)DrawerArrowDrawable
.
就我个人而言,我总是尽量避免反思,只要没有其他方法来做你的肮脏工作。