如何以编程方式在汉堡包图标和背面图标之间切换?
使用波纹管代码我可以将汉堡包图标改回来,但我希望将其更改为动画
actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
感谢
答案 0 :(得分:5)
如果您想要更多地控制菜单/箭头动画,您可能希望直接使用DrawerArrowDrawable而不是使用ActionBarDrawerToggle类。它需要更多的工作,因为你必须创建自己的动画师,但它允许你独立于导航抽屉改变可绘制状态。
编辑:这是一个快速的MenuArrowDrawable类,它扩展了DrawerArrowDrawable并添加了动画师。您需要做的就是将其设置为ActionBar或工具栏图标,并在需要更改状态时调用animateDrawable()。
public class MenuArrowDrawable extends DrawerArrowDrawable {
private final ValueAnimator mMenuToArrowAnimator;
private final ValueAnimator mArrowToMenuAnimator;
public MenuArrowDrawable(Context context) {
super(context);
ValueAnimator.AnimatorUpdateListener animatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setPosition((float)animation.getAnimatedValue());
}
};
mMenuToArrowAnimator = ValueAnimator.ofFloat(0f, 1f);
mMenuToArrowAnimator.setDuration(250);
mMenuToArrowAnimator.addUpdateListener(animatorUpdateListener);
mArrowToMenuAnimator = ValueAnimator.ofFloat(1f, 0f);
mArrowToMenuAnimator.setDuration(250);
mArrowToMenuAnimator.addUpdateListener(animatorUpdateListener);
}
public void setPosition(float position) {
if (position >= 1f) {
setVerticalMirror(true);
} else if (position <= 0f) {
setVerticalMirror(false);
}
setProgress(position);
}
public float getPosition() {
return getProgress();
}
public void animateDrawable(boolean menuToArrow) {
if (menuToArrow && getPosition() >= 1f) return;
if (!menuToArrow && getPosition() <= 0f) return;
ValueAnimator animator = menuToArrow? mMenuToArrowAnimator : mArrowToMenuAnimator;
if (animator.isRunning()) animator.end();
animator.start();
}
}
答案 1 :(得分:1)
感谢@Brucelet的帮助,但需要一次编辑,最终代码是:
public class MainActivity extends AppCompatActivity {
@Bind(R.id.toolbar) public Toolbar toolbar;
@Bind(R.id.drawer_layout) public DrawerLayout drawerLayout;
public ActionBarDrawerToggle actionBarDrawerToggle;
private MenuArrowDrawable drawerArrowDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
setSupportActionBar(this.toolbar);
final ActionBar actionBar = getSupportActionBar();
if(actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setHomeButtonEnabled(true);
this.drawerArrowDrawable = new MenuArrowDrawable(new ContextThemeWrapper(this, R.style.AppTheme_AppBarOverlay), actionBar);
}
this.actionBarDrawerToggle = new ActionBarDrawerToggle(this, this.drawerLayout, 0, 0);
this.drawerLayout.setDrawerListener(this.actionBarDrawerToggle);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
this.actionBarDrawerToggle.syncState();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return this.actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
}
public void menuToBack() {
this.drawerArrowDrawable.animateDrawable(true);
}
public void backToMenu() {
this.drawerArrowDrawable.animateDrawable(false);
}
public class MenuArrowDrawable extends DrawerArrowDrawable {
private final ValueAnimator mMenuToArrowAnimator;
private final ValueAnimator mArrowToMenuAnimator;
private ActionBar actionBar;
public MenuArrowDrawable(Context context, final ActionBar actionBar) {
super(context);
this.actionBar = actionBar;
ValueAnimator.AnimatorUpdateListener animatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setPosition((float) animation.getAnimatedValue());
if(actionBar != null) {
actionBar.setHomeAsUpIndicator(MenuArrowDrawable.this);
}
}
};
mMenuToArrowAnimator = ValueAnimator.ofFloat(0f, 1f);
mMenuToArrowAnimator.setDuration(250);
mMenuToArrowAnimator.addUpdateListener(animatorUpdateListener);
mArrowToMenuAnimator = ValueAnimator.ofFloat(1f, 0f);
mArrowToMenuAnimator.setDuration(250);
mArrowToMenuAnimator.addUpdateListener(animatorUpdateListener);
}
public void setPosition(float position) {
if (position >= 1f) {
setVerticalMirror(true);
} else if (position <= 0f) {
setVerticalMirror(false);
}
setProgress(position);
}
public float getPosition() {
return getProgress();
}
public void animateDrawable(boolean menuToArrow) {
if (menuToArrow && getPosition() >= 1f) return;
if (!menuToArrow && getPosition() <= 0f) return;
ValueAnimator animator = menuToArrow? mMenuToArrowAnimator : mArrowToMenuAnimator;
if (animator.isRunning()) animator.end();
animator.start();
}
}
}
menuToBack()
和backToMenu()
已做好准备!
答案 2 :(得分:0)
我有完全相同的问题。 我已经使用这些代码以编程方式更改图标
public void createBackButton()
{
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setNotifCount();
setSupportActionBar(mToolbar);
mToolbar.setTitle("");
count.setVisibility(View.GONE);
mDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setHomeAsUpIndicator(getDrawerToggleDelegate().getThemeUpIndicator());
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
public void setDefaultActionBar() {
setSupportActionBar(mToolbar);
count.setVisibility(View.VISIBLE);
mToolbar.setTitle("");
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
mDrawerToggle.setDrawerIndicatorEnabled(true);
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDrawerLayout.isDrawerOpen(mLvDrawerMenu)) {
mDrawerLayout.closeDrawer(mLvDrawerMenu);
} else {
mDrawerLayout.openDrawer(mLvDrawerMenu);
}
}
});
}
注意:我在AppCompatActivity和Custom Toolbar中使用此代码