android AnimatorSet AnimationSet 的运行时间差异

项目中用到动画,一个菜单有三级,每一级都用了RecyleView,第二级第三级都用动画弹出,刚开始用了AnimatorSet,但发现菜单出来很慢。


百度了一下AnimatorSet 和 AnimationSet: AnimatorSet 和 AnimationSet 都是动画集合。AnimationSet 使用的是 Animation 子类、AnimatorSet 使用的是 Animator 的子类。


AnimationSet 我们最常用的是调用其 addAnimation 将一个个不一样的动画组织到一起来,然后调用view 的 startAnimation 方法触发这些动画执行。功能较弱不能做到把集合中的动画按一定顺序进行组织然后在执行的定制。Animation 是针对视图外观的动画实现,动画被应用时外观改变但视图的触发点不会发生变化,还是在原来定义的位置。

AnimatorSet 我们最常用的是调用其play、before、with、after 等方法设置动画的执行顺序,然后调用其start 触发动画执行。Animator  是针对视图属性的动画实现,动画被应用时对象属性产生变化,最终导致视图外观变化


1。使用 AnimatorSet 运行时间比设定的mDuration多250ms左右(如mDuration设置200实际没动450ms),这样菜单弹出看起来就很卡


 private void runShowAnimation(View view, long delay) {
        view.setAlpha(0);
        view.setVisibility(View.VISIBLE);

        ObjectAnimator objectAnimator =
                ObjectAnimator.ofInt(view, "ScrollX", UiSizeHelper.getScreenWidth(), 0);
        objectAnimator.setInterpolator(new LinearInterpolator());

        ObjectAnimator objectAnimatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
        objectAnimatorAlpha.setInterpolator(new LinearInterpolator());

        AnimatorSet set = new AnimatorSet();
        set.setDuration(mDuration);
        set.setStartDelay(delay);
        set.playTogether(objectAnimator, objectAnimatorAlpha);
        set.start();

    }



2。于是改用AnimationSet 运行时间比设定的mDuration只多50ms左右(如mDuration设置200实际没动250ms),这样菜单弹出看起来感觉就不一样。


 private void startShowAnimation(View view) {
        view.setVisibility(View.VISIBLE);

        mAnimAlphaIn = new AlphaAnimation(0.0f, 1.0f);
        mAnimAlphaIn.setFillAfter(false);
        mAnimAlphaIn.setInterpolator(new AccelerateInterpolator());

        mTranslateAnimationIn = new TranslateAnimation(-(mFirstLevelWidth / 5), 0, 0, 0);
        mTranslateAnimationIn.setFillAfter(false);
        mTranslateAnimationIn.setInterpolator(new DecelerateInterpolator());

        mAnimationSet = new AnimationSet(false);
        mAnimationSet.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Log.d("time", "onAnimationStart time:" + System.currentTimeMillis());

            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.d("time", "onAnimationEnd time:" + System.currentTimeMillis());

            }
        });
        mAnimationSet.addAnimation(mAnimAlphaIn);
        mAnimationSet.addAnimation(mTranslateAnimationIn);
        mAnimationSet.setDuration(mDuration);

        view.startAnimation(mAnimationSet);
    }

你可能感兴趣的:(android AnimatorSet AnimationSet 的运行时间差异)