【问题标题】:Animate ActionBarDrawerToggle icon programmatically以编程方式为 ActionBarDrawerToggle 图标设置动画
【发布时间】:2014-10-21 05:28:51
【问题描述】:

我想手动将抽屉图标从汉堡变为箭头,反之亦然,不仅在拖动抽屉时,这可能吗?我正在使用支持库 appcompat-v7:21。

我也找不到有帮助的 android.support.v7.app.ActionBarDrawerToggle 的源代码。

【问题讨论】:

    标签: android android-actionbar android-appcompat android-5.0-lollipop


    【解决方案1】:

    我找到了一种使用简单 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();
    

    但也许有更好的解决方案。

    【讨论】:

    • 感谢您的回答!这对我来说非常有效,尽管我同意可能有更好的解决方案。但就目前而言,这是唯一有效的解决方案:)
    【解决方案2】:
    // 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多