一、前言

无法设置动画执行顺序。

整个ViewPropertyAnimator的功能都是建立在View类新增的animate()方法之上的,这个方法会创建并返回一个ViewPropertyAnimator的实例,之后的调用的所有方法,设置的所有属性都是通过这个实例完成的。

大家注意到,在使用ViewPropertyAnimator时,我们自始至终没有调用过start()方法,这是因为新的接口中使用了隐式启动动画的功能,只要我们将动画定义完成之后,动画就会自动启动。并且这个机制对于组合动画也同样有效,只要我们不断地连缀新的方法,那么动画就不会立刻执行,等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。当然如果不想使用这一默认机制的话,我们也可以显式地调用start()方法来启动动画。

ViewPropertyAnimator的所有接口都是使用连缀的语法来设计的,每个方法的返回值都是它自身的实例,因此调用完一个方法之后可以直接连缀调用它的另一个方法,这样把所有的功能都串接起来,我们甚至可以仅通过一行代码就完成任意复杂度的动画功能。

二、实现

  • 1、 只会执行一次

    1. //只执行一次
    2. iv_header.setOnClickListener {
    3. iv_header.animate().translationX(500f).rotation(180f)
    4. .setDuration(1000).start()
    5. }

    或者使用ViewCompat实现:

    1. ViewCompat.animate(iv_header)
    2. .translationX(500f).rotation(180f).setDuration(1000)
  • 2、 会多次执行

    1. //每次点击会再次执行
    2. iv_header2.setOnClickListener {
    3. iv_header2.animate().translationXBy(500f).rotationBy(180f).setDuration(1000).start()
    4. }

    三、封装库相关

animate
DSLAnimator
动画代码太丑,用Kotlin DSL来拯救!