一个错误使用Android 属性动画的例子

现在要做个简单的动画效果:
这里写图片描述
错误的实现方法:
1,属性动画非常的方便,也能实现非常好的动画效果,非常强大。但以下使用方式是非常错误的:

/**
 * 教师端课前,课中,查看作业,三个小书动画
 * @param v
 */
public static void setAnim(View v){
    ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(v, "scaleX", 1f, 1.25f, 1f, 1.25f, 1f);
    ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(v, "scaleY", 1f, 1.25f, 1f, 1.25f, 1f);
    ObjectAnimator rotation = ObjectAnimator.ofFloat(v, "rotation", 0f, -15f, 15f, 0f);
    final AnimatorSet set = new AnimatorSet();
    set.play(scaleXAnimator).with(scaleYAnimator).before(rotation);
    set.setDuration(2000);
    set.start();
    set.addListener(new Animator.AnimatorListener(){
        @Override
        public void onAnimationStart (Animator animator) {

        }
        @Override
        public void onAnimationEnd (Animator animator)
        {
            set.start();  //行24
        }
        @Override
        public void onAnimationCancel (Animator animator){

        }@Override
        public void onAnimationRepeat (Animator animator){

        }});
}

使用错误原因:
如果在主线程中这样使用,24行这样的做法相当于一个死循环,很快主线程就oom了

正确用法:
    官方推荐用法:
    PropertyValuesHolder holdeX = PropertyValuesHolder.ofFloat("scaleX", 1f, 1.25f, 1f);
    PropertyValuesHolder holderY = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.25f, 1f);
    ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(v, holdeX, holderY);
    animator.setRepeatCount(ValueAnimator.INFINITE);
    animator.setRepeatMode(ValueAnimator.RESTART);
    animator.setDuration(1000);
    animator.start();

    使用属性的方式设置重复动画效果则不会出现oom(虽然还未证实,但很可能系统api重复动画应该用的子线程,后续继续了解)

猜你喜欢

转载自blog.csdn.net/u014434080/article/details/77683680