android那些事--属性动画03-animatorset和监听事件(打辅助)

如果一个对象需要同时执行多个动画效果,在属性动画中可以借助PropertyValuesHoler或者AnimatorSet这两个类来实现,二者相对比AnimatorSet能力更加强一些.

PropertyValuesHoler的使用

  public TextView mTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv = ((TextView) findViewById(R.id.tv));
        mTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                initAnimator();
            }
        });
    }

    private void initAnimator() {
        PropertyValuesHolder translationX=PropertyValuesHolder.ofFloat("translationX",300f);
        PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX",1f,0f,1f);
        PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1f,0f,1f);
        ObjectAnimator animator = ObjectAnimator
                .ofPropertyValuesHolder(mTv, translationX, scaleX, scaleY);
        animator.setDuration(5000);
        animator.start();
    }

效果如下,至于动画的效果可以根据实际情况去完成,这里只是说PropertyValuesHoler这个类如何使用.

这里写图片描述

AnimatorSet的使用

使用AnimatorSet不仅同样可以完成这样的效果还可以精确的控制某个效果的执行顺序

   private void initAnimator() {

        ObjectAnimator translationX=ObjectAnimator.ofFloat(mTv,"translationX",300f);
        ObjectAnimator scaleX=ObjectAnimator.ofFloat(mTv,"scaleX",1f,0f,1f);
        ObjectAnimator scaleY=ObjectAnimator.ofFloat(mTv,"scaleY",1f,0f,1f);

        AnimatorSet set=new AnimatorSet();
        set.setDuration(5000);
        set.playTogether(translationX,scaleX,scaleY);
        set.start();
    }

这段代码实现效果和上面使用PropertyValuesHoler一样,从直觉上感觉这个更合理更容易接受些,某些单一的动画放到一个动画容器里,然后一起执行.对于AnimatorSet还有这些常用的方法 playSequentially(), play().with().before().after()等来控制动画的协同.

动画监听器

在上面的过程中已经通过addUpdateListener这个方法为ValueAnimator设置了监听,设置监听的方法有两个一个是addUpdateListener() 另一个是addListener().

这里写图片描述

这里写图片描述

如上图所示,因为我们使用较多的是addListener().

推荐阅读更多精彩内容