代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

为什么在工具栏上执行汉堡包到箭头的动画时会有不同的动画?

  •  0
  • Cheok Yan Cheng  · 技术社区  · 7 年前

    两个应用程序都在使用 implementation 'com.android.support:design:27.1.1'

    第一个应用程序-简单的汉堡包箭头动画

    https://www.youtube.com/watch?v=i0-vmhOQPB0&feature=youtu.be

    https://www.youtube.com/watch?v=1DljB0rskWE&feature=youtu.be

    真正让我困惑的是,为什么有两个不同的动画。两个应用程序使用相同的支持库,具有相同的动画代码。

    private static class ActionBarDrawerToggleEx extends android.support.v7.app.ActionBarDrawerToggle {
        public ActionBarDrawerToggleEx(Activity activity, DrawerLayout drawerLayout,
                                       Toolbar toolbar, @StringRes int openDrawerContentDescRes,
                                       @StringRes int closeDrawerContentDescRes) {
            super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes);
        }
    
        public void enableAnimation(boolean enable) {
            enableAnimation = enable;
        }
    
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, enableAnimation ? slideOffset : 0);
        }
    
        private volatile boolean enableAnimation = true;
    }
    
    private void animateHamburgerToArrow() {
        actionBarDrawerToggle.enableAnimation(true);
    
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    
        ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
        anim.addListener(new ValueAnimator.AnimatorListener() {
    
            @Override
            public void onAnimationStart(Animator animator) {
    
            }
    
            @Override
            public void onAnimationEnd(Animator animator) {
                actionBarDrawerToggle.enableAnimation(false);
                arrowVisible = true;
            }
    
            @Override
            public void onAnimationCancel(Animator animator) {
    
            }
    
            @Override
            public void onAnimationRepeat(Animator animator) {
    
            }
        });
    
        anim.addUpdateListener(valueAnimator -> {
            float slideOffset = (Float) valueAnimator.getAnimatedValue();
            actionBarDrawerToggle.onDrawerSlide(null, slideOffset);
        });
        anim.setInterpolator(new DecelerateInterpolator());
        // You can change this duration to more closely match that of the default animation.
        anim.setDuration(300);
        anim.start();
    }
    

    你知道为什么相同的代码会产生不同的动画吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Cheok Yan Cheng    7 年前

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">false</item>
        <item name="color">@android:color/white</item>
    </style>
    
    <style name="Theme.MyApp.Base.Light" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>