爱心点击跳动——安卓动画AnimatorSet的使用

405 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

今天我们继续说安卓的动画,如何让爱心有更多的动画,上节我们说到让爱心动起来,而且添加了比较奇怪的插值器,让动画显得很奇怪,那本节我们就将爱心去除上次的动画,改成跳动的效果。

正篇

首先我们还是用上一篇的自定义View爱心图(画个爱心——使用Kotlin自定义View - 掘金 (juejin.cn)),然后为其添加缩放的动画效果

实现过程与代码

AnimatorSet

这是一个可以添加多个动画效果的方法,并且我们还能用它来决定动画顺序与每个动画何时开始:

play(objectAnimator).before(objectAnimator1).after(objectAnimator2).after(5000)

其中play()方法中放我们的第一个objectAnimator对象,后面接着使用before()方法去传入第二个objectAnimator对象,这个方法就是让其在第一个objectAnimator对象前播放动画,而after()方法有些不一样,它有两种用法,如果我们传入objectAnimator对象就是在第一个objectAnimator对象的后面播放动画,如果我们传入数值,就是时间推迟对应数值开始播放动画。

此外,我们使用 playSequentially(),还可以让两个动画依次播放,而不是为它们设置监听器来手动为它们监管协作。以及playTogether(),也是同时播放的方法

接下来我们使用AnimatorSet去设置一组动画:

val objectAnimator = ObjectAnimator.ofFloat(binding.vLove, "translationX",5f, -5f)

val objectAnimator2 = ObjectAnimator.ofFloat(binding.vLove, "scaleX",0.5f,1f)

val objectAnimator3 = ObjectAnimator.ofFloat(binding.vLove, "scaleY",0.5f,1f)

val objectAnimator1 = ObjectAnimator.ofFloat(binding.vLove, "translationY",10f, -5f)
AnimatorSet().apply {
    play(objectAnimator).with(objectAnimator1).with(objectAnimator2).with(objectAnimator3)
    start()
}

我们创建了四个objectAnimator对象,并用objectAnimator对象的ofFloat()方法去设置对应的动画效果,该方法传入的第一个值为我们View对象,第二个参数是我们的动画效果名字符串比如“translationY”,也可以自定义对应的动画效果,第三第四参数都是对前面那个动画效果的依次变化大小值。

objectAnimator对象的动画部分配置好后,就用我们刚学的AnimatorSet的apply{}方法去实现对应的动画顺序,这里我们采用的with()方法连接是和上一篇的效果一样,都是表示同时展示动画。

运行程序,效果如下,我们可以手动点击按钮让爱心跳起来:

ec0c5565ab8d5d4be0776d79899f12e2.gif

错误点提出

我们使用的scaleY/X都是对这个view整体坐标在缩放,所以并不会出现以爱心中心缩放的效果,这一点上我估错了效果。

我们需要对动画的效果进行改进,使用合适的变化方式来控制,如果不好实现的话,甚至我们应该改变思路,可以从我们自定义的View中更改效果,因为这里面的坐标我们更好控制,让其在自定义View类时候就实现跳动效果,所以后面我会再积极改良这个效果,在本文中继续更新后续效果改进,敬请期待。

总结

今天的动画有的过于简单,后面在本文再继续更新添加新效果,让爱心自己跳动起来,预估是在自定义View里面操作,甚至自定义View说不定也得重新绘画,不是采用绝对值去绘制了。