阅读 739

Android动画之ObjectAnimator

我们已经熟悉了ValueAnimator的使用,但是ValueAnimator有一个缺点,那就是只能对动画中的数值进行计算,无法直接作用到某个View,如果想将其应用到某个View,需要监听ValueAnimator的动画过程,来应用到View的某个或者某些属性中,相比于视图动画要繁琐的多。

为了能让属性动画可以直接和View关联起来,Google在ValueAnimator的基础上派生了ObjectAnimator,也正是因为这样,在ValueAnimator中能使用的函数在ObjectAnimator中都可以正常使用。

比如我们要实现一个渐隐渐现的效果,可以这样写

val objectAnimator:ObjectAnimator = ObjectAnimator.ofFloat(textview,"alpha",1f,0f,1f)
objectAnimator.duration = 2000
objectAnimator.start()复制代码

ObjectAnimator.ofFloat的第一个参数用于指定将要应用动画效果的View。 第二个参数用于指定该动画是通过修改哪个属性从而达到想要的效果。 第三个参数是一个变长参数,比如此处的1f,0f,1f,表示将textView 的alha属性从1变到0,再从0变到1。最终的效果如下所示:

Filmage 2022-01-23_152711.gif

比如我们想要实现一个旋转效果,可以这样写:

val objectAnimator:ObjectAnimator = ObjectAnimator.ofFloat(textview,"rotation",0f,180f,360f)
objectAnimator.duration = 2000
objectAnimator.start()复制代码

最终的旋转效果如下:

旋转.gif

ObjectAnimator中的关键函数:set函数

看到这里,我们有一个疑问,我们想要实现一个旋转动画时,是如何确定的rotation,我们设置后,ObjectAnimator又是如何让View 旋转的呢,其实是通过指定属性所对应的set函数来改变的,比如我们设置rotation后,ObjectAnimator就会去对应的控件中找到setRotation函数来改变属性的值,从而实现动画效果。下面我们列出了View中常用的几组动画效果。

  • 透明度

    • alpha

  • 旋转度数

    • rotation

    • rotationX

    • rotationY

  • 平移

    • translationX

    • translationY

  • 缩放

    • scaleX

    • scaleY

关于ObjectAnimator的几点总结:

1、拼接set函数的方法,是将属性的第一个字母大写。

2、 如何确定函数的参数类型呢?根据set函数中参数类型来确定。

3、 调用set函数之后怎么办呢?调用set函数之后,会尝试修改View的属性值,之后会调用invalidate函数进行重绘。

4、 set函数的调用频率是多少呢?由于动画在进行时每隔十几毫秒就会刷新一次,所以set函数也会每隔十几毫秒被调用一次。

以下是几个小例子

沿X轴旋转

val objectAnimator = ObjectAnimator.ofFloat(textview,"rotationX",0f,180f,360f)
objectAnimator.duration = 2000
objectAnimator.start()复制代码

Untitled.gif

沿Y轴旋转

val objectAnimator = ObjectAnimator.ofFloat(textview,"rotationY",0f,180f,360f)
objectAnimator.duration = 2000
objectAnimator.start()复制代码

Filmage 2022-01-23_193759.gif

在X轴平移

val objectAnimator = ObjectAnimator.ofFloat(textview,"translationX",0f,200f,-200f,0f)
objectAnimator.duration = 2000
objectAnimator.start()复制代码

Filmage 2022-01-23_193947.gif

在X轴缩放

val objectAnimator = ObjectAnimator.ofFloat(textview,"scaleX",1f,4f,1f)
objectAnimator.duration = 2000
objectAnimator.start()复制代码

Filmage 2022-01-23_194702.gif

eObjecnAnimator需要指定需要的View,在开始动画后会尝试在View中找到属性所对应的set函数,然后把动画中间值作为参数传递给set函数并执行他,所以我们如果在自定义 的view中为属性设置了set函数,我们也可以对其使用ObjectAnimator动画。

参考资料《Android自定义控件开发与实战》


作者:哈喽呀
链接:https://juejin.cn/post/7056305684354170887


文章分类
ANDROID
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐