ActionBarDrawerToggle - 以编程方式将汉堡包图标切换回图标

时间:2015-10-27 17:01:50

标签: android android-actionbar toolbar

如何以编程方式在汉堡包图标和背面图标之间切换?

使用波纹管代码我可以将汉堡包图标改回来,但我希望将其更改为动画

actionBarDrawerToggle.setDrawerIndicatorEnabled(false);

感谢

3 个答案:

答案 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中使用此代码