通过源码,手把手带你学属性动画(一) - 相关类总览

转载请注明出处:http://blog.csdn.net/My_TrueLove/article/details/52538465

访问 ruicb.com,一键抵达我的博客!

在 Android 3.0(API level 11) 之后,Google 为 Android添加了属性动画(Property Animation),该动画系统是一个强大的框架,允许开发者对几乎任何对象进行动画。

由此可知,属性动画致力于为开发者提供更好的动画解决方案。值得注意的是,属性动画已不再针对View设计,而是更偏向于对值进行动画变换,因此可以操作任何对象的任意属性

相比于补间动画,属性动画解决了补间动画移动后点击时间留在原位的问题,且属性动画扩展性高、定制性强,不再局限于缩放、旋转、透明度、平移等操作。至于二者实际的效果差距不再对比,本系列的文章重点是剖析属性动画。

0. 写本系列教程的初衷

网上有关属性动画的教程已经很多了,有很多都讲的很好。但我之所以还会去写这系列文章,只是想从一个不同的角度去分析属性动画,让更多的人认识到源码和官方教程的重要性。同时我也会拿捏好度,不会让读者过度的沉溺源码,毕竟我的文章侧重初中级开发人员,这一阶段适当但不过分的接触源码,对以后很有帮助。

本系列文章,将带你由浅入深剖析属性动画。我们主要的参考资料是源码、官方API文档,期间会不时通过源码简单的分析动画的实现原理,以了解动画的工作机制,知其然知其所以然,这样才能更好的掌握属性动画。

注:参考的源码API等级为23,望知晓。同时建议读者在学习时,能够对照源码去看,这样能够加深理解。

学完本系列文章,你可以自如应对开发中大多数动画效果。只是在一些复杂、定制性高的情况下,要求我们能够融会贯通、举一反三,但是所涉及的内容在本文都会提到,只是讲解的篇幅会根据使用频率的高低有所不同。

广告:对属性动画感兴趣的,欢迎关注我的公众号,以及时获取最新内容。

1. API 一览

下面开始正式学习,让我们先先了解一下与属性动画相关的类,以对此属性动画系统一个整体的认识,这样有利于学习后面的知识。

属性动画主要依靠抽象类 Animator 的支持,Animator 类位于 android.animation 包下,源码中对 Animator 类的注释如下:

This is the superclass for classes which provide basic support for animations which can be started, ended, and have AnimatorListeners added to them.
该类是对动画提供基础支持的类的父类,这些动画可以被开始、结束,并且可以被添加动画监听。

那么,与属性动画相关的、继承自 Animator 的类有哪些呢?先看一下 Google API 文档对 Animator 类结构的介绍:

Google官方API链接点这里

为了方便看,我截了一张图:

Animator的API文档

可以看出,Animator的直接子类有 AnimatorSet 和 ValueAnimator,间接子类有 ObjectAnimator 和 TimeAnimator。为了更直观的表示继承关系,我又画了一个超级简单的UML图:

简单的UML图

这样就比较直观了,接下来,我们就来挨个简单介绍一下各个类的作用。

2. API 详解

以下对各个类的介绍,大部分翻译自官方文档,这样才能保证准确性。同时,因水平有限,若有错误之处还望见谅。标记为“略”的表示不是后面重点介绍的对象。

2.1 Animator(略)

该类是对动画提供基础支持的类的父类,这些动画可以被开始、结束,并且可以被添加动画监听。我们平时很少与这个类直接打交道,更多的是用到其子类(ValueAnimator、ObjectAnimator等),以及该类的内部静态接口。

public static interface AnimatorListener{
    //...
}

该接口是一个动画监听器,负责接收动画过程中的通知,这些通知标识了与动画相关的事件。这些事件通过接口的回调方法公开出来,我简单翻译整理了一下,如下所示:

public static interface AnimatorListener {
    /**
     * 通知动画开始
     */
    void onAnimationStart(Animator animation);
    /**
     * 通知动画结束
     * 当动画的重复次数为INFINITE(无数次)时,该回调方法将不会被调用
     */
    void onAnimationEnd(Animator animation);
    /**
     * 通知当动画取消
     * 同上,当动画的重复次数为INFINITE(无数次)时,该回调方法将不会被调用
     */
    void onAnimationCancel(Animator animation);
    /**
     * 通知动画重复
     */
    void onAnimationRepeat(Animator animation);
}

有关动画监听的使用,将在后续文章中更新。

2.2 ValueAnimator

class ValueAnimator extends Animator

ValueAnimator 继承自 Animator,其可以帮助我们对值进行动画操作。

源码中有关该类的注释翻译过来就是:

本类为运行动画提供了一个简单的计时引擎(timing engine),用来计算动画完成值(animated values)并设置到目标对象上。

有关该类的注释并没有提及 View ,因为其仅针对Value(值)进行动画变换。尽管如此,它却是属性动画的核心类,后面要介绍的 ObjectAnimator 就是在 ValueAnimator 基础上进行的二次封装。

2.3 ObjectAnimator

class ObjectAnimator extends ValueAnimator

ObjectAnimator 继承自 ValueAnimator,支持对目标对象的属性进行动画(animating properties on target objects),但正如上面所说,其实现动画的核心功能是由 ValueAnimator 支持的。

使用时,通过参数定义需要进行动画操作的目标对象,以及动画所针对的属性名称。对于属性名称,我们要确保对象内部存在相应的 gettersetter 方法,这样动画才可以在必要时调用以对属性进行动画。

2.4 TimeAnimator(略)

class TimeAnimator extends ValueAnimator

TimeAnimator 与 ObjectAnimator一样,都继承自 Animator。该类提供了一个简单的回调机制,去监听当前动画与系统中其他动画是否同步。该类在实际开发中很少会用,后面也不会再讲解,感兴趣的可以自己看一下。

2.5 AnimatorSet

class AnimatorSet extends Animator

AnimatorSet 主要用来支持组合动画,其可以帮助我们在特定的顺序下播放一组 Animator 动画(plays a set of Animator objects in the specified order)。动画可以被设置为同时播放、异步播放或者在特定的延时之后播放。

AnimatorSet 操作的对象为 Animator,而 ValueAnimator 和 ObjectAnimator 都是 Animator 的子类,所以都可以借助 AnimatorSet 实现组合动画。

我们可以借助该类定制出许多炫酷的动画效果,要问有多炫酷,我只能说局限于你的想象力!

3. 总结

本文就到这儿了,主要就是系统的看了一下与属性动画相关的一些类。如果你接触过属性动画,你可能会觉得太简单了,但是对于一些初学者,简单的讲一些原理性的东西,对于后面的理解十分有帮助。

下面回顾一下本文的内容:

  1. 本系列文章的主要目标,以及我们最终能达到什么样的一个水平。
  2. 从Animator出发,了解了与熟悉动画相关的几个类,并附上了UML图,你应该对图中的层级结构了然于心;
  3. 着重介绍了一下每个类的作用,以及动画监听器AnimatorListener。

通过本文,我们认识了与属性动画相关的几个类,但我们关注的重点只有 ValueAnimator、ObjectAnimator 和 AnimatorSet。当然还有一些辅助属性动画的类没有提及,在后续实战中会提及,并延伸一些属性动画的高级用法,比如插值器、估值器等,以及如何让自定义它们实现系统没有提供的效果。

4. 下篇预告

讲解 ValueAnimator 和 ObjectAnimator的使用,以及使用动画监听器AnimatorListener监听动画的过程,具体内容会根据篇幅决定,过完节回来及时更新,敬请期待。

下篇已经更新:通过源码,手把手带你学属性动画(二) - ValueAnimator基础


扫描下方二维码,关注我的公众号,及时获取最新文章推送!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值