Android基础夯实--重温动画(三)之初识Property Animation

每一个人都有必定的理想,这种理想决定着他的努力和判断的方向。就在这个意义上,我历来不把安逸和快乐看做生活目的的自己——这种伦理基础,我叫它猪栏的理想。——爱因斯坦html

若是你们想看更多关于Android基础夯实系列博文,请移步到个人博客:
Ryane's Blogandroid

1、摘要

Property Animation(属性动画)是一个很是强大的框架,它容许你让任何对象都实现动画效果。 由于无论一个对象是否出现屏幕中,你均可以随时去改变它的属性,而属性动画正是经过在某个时间点改变对象的属性实现动画效果的。Property Animation是在Android 3.0(API 11)以后推出的,以其具备高扩展性,解决了一些View Animation所不能解决的问题,因此,对于Android开发者来讲,Property Animation是一个很是重要的知识点。git

本文主要对ValueAnimator作介绍,若是你们有兴趣,能够继续阅读本动画系列其余相关文章,做者也在不断更新完善相关内容,但愿你们能够指出有误之处。github

Android基础夯实--重温动画(一)之Tween Animationapi

Android基础夯实--重温动画(二)之Frame Animation架构

Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解框架

1.1 背景

因为Tween Animation(补间动画)只能实现简单的四种的动画(alpha、scale、rotate、translate),要想实现比较复杂的动画就难以知足需求,而Frame Animation只是改变了View对象绘制的背景,而没有改变View对象自己。因此当咱们想使用View Animation实现一些特殊的动画效果时,就比较困难了。例如,当咱们想改变一个控件的背景颜色时,视图动画并不能实现;当咱们想设置一个按钮在位置转换以后,仍然保持点击事件,视图动画也不能实现。在这个背景之下,属性动画应运而生。ide

1.2 区别

说了这么多,那么视图动画和属性动画到底有什么区别呢?动画

首先,在直观上,属性动画是区别于视图动画的:ui

(1) 时间不同: 视图动画是从API LEVEL 1就引入了;而属性动画是从API LEVEL 11以后才引入。

(2) 名字不同: 视图动画的Tween Animation命名为xxxAnimation、Frame Animation命名为AnimationDrawable;而属性动画,则命名为xxxAnimator。

(3) 包名不同: 视图动画的Tween Animation在包android.view.animation下,而Property Animation在包android.animation中。

其次,从根本上,咱们能够总结出视图动画和属性动画的两个主要区别:

(1) 视图动画只能改变View的位置或者视觉效果,并不能改变其属性。例如:使用Tween Animation对Button实现位移变换后位置改变,可是点击Button最后停留位置时,并不能响应点击事件。怎么理解呢,举个例子:

视图动画不能改变其属性

由上图可知,咱们给TextView设置了点击事件,当咱们分别使用Tween Animation和Property Animation移动TextView时,当使用Tween Animation位移TextView后,它的点击事件无效,当使用Property Animation移动TextView后,它的点击事件仍然有效。因而可知,视图动画并不能改变View的属性,而属性动画能够。

(2) 视图动画做用对象只限制为View,而属性动画做用对象不限为View,而是任何对象。例如:属性动画能够改变颜色值而视图动画作不到。一样举个例子:

视图动画只做用于View

由上图能够看到,当咱们须要对一个对象的颜色值进行改变时,视图动画并不能实现这个效果,上图是经过属性动画来实现的,由此能够推测出,视图动画只能对View起做用,而属性动画做用的不仅是View,而是对象。

1.3 建议

虽然Property Animation的优势要多于View Animation,可是View Animaiton可让咱们花更少的时间和更少的代码去实现,因此若是View Animation已经足以知足咱们的平常须要,那么咱们就不必使用Property Animation了,固然,若是咱们都涉及到的话,同时使用View Animation和Property Animation多是更有效的办法。

若是你想了解更权威的解释,能够查看官方文档:Property Animation

本文主要对Property Animation作介绍,若是你们有兴趣,能够继续阅读本动画系列其余相关文章:

Android基础夯实--重温动画(一)之Tween Animation

Android基础夯实--重温动画(二)之Frame Animation

2、工做原理

在讲述具体Property Animation相关API以前,我想先给你们讲一下属性动画是如何工做的。下面经过一个例子,这是Android开发指南上面的一个例子,我以为很是好理解,这里就搬过来了。

首先,咱们来看一个例子。以下图描述的是一个对象在它的x方向上进行水平运动的动画(规定右方向为正轴),固然咱们能够对应成手机屏幕上的位置。这个动画的时长为40ms,对象在x正方向运动了40个像素,在每一个10ms内,这个对象就往x正方向运动10个像素,在第40ms时,这个动画停在了x方向上的40像素,这是一个水平匀速运动的例子。

图1 匀速水平运动示例

固然,咱们也能够给动画定义一个具备不匀速插值器(Interpolation),是它运动过程为不匀速。
以下图也是一个对象的运动过程,可是它并非匀速运动,而是开始加速,在结束前减速。这个对象仍然是在40秒内运动了40个像素的距离,可是这个过程是不匀速的,它从开始到中间位置进行了加速运动,在中间位置到结束位置则进行了减速运动。

图2 非匀速水平运动示例

从上面两个例子能够看到,当咱们想要一个对象实现必定的动画效果时,咱们能够经过对应的图,还有相关的数据,和相关数据伴随时间的变化来描述该动画过程,可是咱们的属性动画的内部是如何像咱们这样来描述自身的变化过程的呢?以ValueAnimator为例,咱们来看一下属性动画的重要组成部分,以下图所示。

图3 属性动画的组成部分

ValueAnimator是属性动画最基础的一个类(咱们暂且不深究它,反正它能帮助咱们实现图2的先加速后减速的过程)。首先它在内部封装了很是重要的两个接口,第一个就是TimeInterpolator,另外一个是TypeEvaluator。你们在内心必须先有个概念,在全部的属性动画里面,都拥有这两个东西。

TimeInterpolator是什么呢?很是简单,就是咱们上面所说的插值器,简单来讲就是描述对象加速度的一个东西,再简单一点来讲就是描述速度变化的一个东西。

TypeEvaluator又是什么呢?你们能够理解为求值器,它是根据上面的插值器来计算对象属性具体值的这么一个东西。

ValueAnimator在执行以前,首先会把时间分为百分数,由0~1,如上图动画过程为40ms,那么在10ms时,时间因子为0.25,在40ms时,时间因子为1。

在计算完时间因子以后,ValueAnimator会调用TimeInterpolator来进行计算插值因子,在图2对应为速度,对应10ms时的速度咱们知道会比20ms时的速度会低;而图1中,每个时刻的速度都同样,因此TimeInterpolator大概是作这么一件事情。

在TimeInterpolator计算完了以后,那么咱们的TypeEvaluator就要起做用了,由于上图对应的是对象的位置变化,因此TypeEvaluator为IntEvaluator。这个TypeEvaluator主要是根据TimeInterpolator提供的插值因子(速度),还有startPropertyValue(开始时间)和endPropertyValue(结束时间),计算出某个时刻的属性值(位移),如图2,假如t=10ms时刻,TimeInterpolator给咱们返回值为0.15,那么这时在x方向上的位移为0.15 * (40 - 0) = 6。

而这种计算过程在动画执行时间(duration)内是不断重复的,由于ValueAnimator有一个叫作AnimatorUpdateListener的监听器,它会跟踪动画的每个时刻,因此咱们能够在里面进行不断的计算,经过getAnimatedValue()来获取最新值,直到动画结束。

一个属性动画的执行过程大概如上,相信你们已经对属性动画有了基本的了解,那么咱们下面根据API来对属性动画进行详细讲解。

3、API概况

前面咱们说到,属性动画机制全部相关的类都位于android.animation包之下,因此你们有须要能够到官方文档中进行查阅。下面几个表格是属性动画中经常使用的类,首先给你们大概介绍。

表格1. Animators

Class Description
ValueAnimator 针对值变化的Animator。
ObjectAnimator 针对Object变化的Animator。
AnimatorSet 运行一组Animator的集合。

Animator类做为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,可是咱们不能直接使用它,由于它只是提供了最基本的的实现动画的方法,只有让它的子类继承它并进行相应扩展以后,咱们才会使用它实现动画。在属性动画中,Animator包括了ValueAnimator、ObjectAnimator和AnimatorSet三个子类,咱们分别来介绍一下这三个类。

表格2. Evaluators

Class Description
TypeEvaluator 求值器接口,全部求值器必须实现该接口。
IntEvaluator 计算Int类型的求值器。
FloatEvaluator 计算Float类型的求值器。
ArgbEvaluator 计算颜色值类型的求值器。

API中为咱们提供了求值器的接口TypeEvaluator,固然还要它的实现类,例如IntEvaluator、FloatEvaluator、ArgbEvaluator、 IntArrayEvaluator、FloatArrayEvaluator等,它们都是根据fraction因子来计算出对应的属性值,固然咱们也能够自定义本身的Evaluator。

表格3. Interpolators

Class Description
TimeInterpolator Animator的插值器接口。

TimeInterpolator做为属性动画的插值器接口,咱们都知道在View Animation中有不少插值器,例如AccelerateDecelerateInterpolator(先后减速,中间加速)、AccelerateInterpolator(先慢后加速)等插值器,在属性动画中咱们一样可使用这些插值器,这里就不详细列出来了,不了解的同窗能够看我以前的文章:Android基础夯实--重温动画(一)之Tween Animation。固然,咱们也能够自定义本身的Interpolator。

4、结语

因为文章篇幅过长,不利于你们阅读,因此这篇文章首先给你们介绍属性动画这个概念,相信经过例子和文字的介绍,你们也已经对属性动画有所了解,那么接下来,我就会给你们详细讲解属性动画中的每个知识点,固然,也会分多篇文章进行分析,若是你已经准备好,请继续阅读Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解

相关文章
相关标签/搜索