[Android Pro] Property Animation
Property Animation是如何运作的
- 场景一(Linear Animation):Animation要求一个物体A的x属性在40ms内匀速地从0px变化到40px。帧的刷新率默认为10ms/帧。
- 场景二(Not-Linear Animation):Animation要求一个物体A的x属性在40ms内先加速后减速地从0px变化到40px。帧的刷新率默认为10ms/帧。
- ValueAnimator对象持续跟踪animation的时间点,如animation运行了多长时间,属性(如场景一二中的x属性)的当前值。
- ValueAnimator封装了一个TimeInterpolator,TimeInterpolator定义了animation是如何插值的。ValueAnimator也封装了一个TypeEvaluator,TypeEvaluator定义了如何计算属性的值。例如示例2中,TimeInterpolator使用的是AccelerateDecelerateInterpolator和TypeEvaluator使用的是IntEvaluator
- 创建了一个ValueAnimator并为ValueAnimator注入animation的starting value、ending value、duration value后,调用start()方法来启动animation。
- 在Animation的整个运行过程中,ValueAnimator会基于动画运行的时间计算出一个0-1的值,这个值被称为elapsed fraction。如场景一t=10ms的时刻,elapsed fraction的值为0.25,因为整个动画的运行时间是40ms,所以elapsed fraction=10/40。
- 在ValueAnimator完成elapsed fraction的计算之后,它会调用TimeInterpolator去计算interpolated fraction的值。interpolated fraction会根据elapsed fraction的值来计算。例如,在场景二中,由于是缓慢加速的原因,在t=10ms的时刻,interpolated fraction的值为0.15,会小于elapsed fraction的值0.25。而在场景一中,由于是匀速的关系,interpolated fraction的值会永远与elapsed fraction的值一样的。
- 在ValueAnimator完成elapsed fraction的计算之后,它会调用合适的TypeEvaluator去计算属性的当前时刻的值,这个计算过程是基于interpolated fraction的值、starting value和ending value。例如,在场景二t=10ms的时刻点,interpolated fraction的值为0.15,因此属性x的值便会是0.15X(40-0)=6.
Property Animation API概览
- Animator:它提供了创建animation最基本的结构,基本上不会直接地用到这个类,要使用这个类,必须继承它并实现需要的功能。
- ValueAnimator:property animation主要的时间引擎,它计算了各个帧的属性值。它包括所有核心功能:计算每个帧的相关内容,负责接收更新事件,按属性值的类型自定义计算规则。一个动画需要完成两大块内容:计算各帧的相关内容和并为对象设置这些计算后的值。ValueAnimator不负责第二块内容,因此你必须由ValueAnimator监听计算值的更新并修改对象相关属性值。
- ObjectAnimator:ValueAnimator子类,它允许你设置一个对象的属性来完成动画。ObjectAnimator更加常用,因为使用它来建立动画会更加简单。然而,有时你需要用到ValueAnimator,因为ObjectAnimator会有一些限制。
- AnimatorSet:把多个Animator捆绑在一起,可以让他们同时播放,或按顺序地播放、或延时一段时间播放。
- IntEvaluator:用于计算Int类型属性值的计算器。
- FloatEvaluator:用于计算Float类型属性值的计算器。
- ArgbEvaluator:用于计算以16进制形式表示的颜色值的计算器。
- TypeEvaluator:一个计算器接口,它允许你创建你自己的计算器。如果你正在计算一个对象属性并不是int,float或者颜色值类型的,那么你必须实现TypeEvaluator接口去指定如何去计算对象的属性值。
- AccelerateDecelerateInterpolator:先加速后减速的插值器
- AccelerateInterpolator:加速插值器
- AnticipateInterpolator:先往变化的相反方向回退,然后甩到尾值的插值器
- AnticipateOvershootInterpolator:先往变化的相反方向回退,然后甩到尾值并越过尾值,再返回到尾值。
- BounceInterpolator:
- CycleInterpolator:指定重复次数的插值器
- DecelerateInterpolator:减速插值器
- LinearInterpolator:线性(匀速)插值器
- OvershootInterpolator:超过尾值再返回到尾值的插值器
- TimeInterpolator:用于实现自己的插值器的接口
使用ValueAnimator创建动画
ofInt()
, ofFloat()
, or ofObject()。
例如:
上面的例子实现了在1000ms内,值从0-1的变化。也可以提供一个自定义的Evaluator:
使用ObjectAnimator创建动画
为了让ObjectAnimator能正常地运作,你还需要注意下面几点:
- 要为对应的对象提供setter方法,如上例中需要为foo对象添加setAlpha(float value)方法。在不能修改对象源码的情况下,要不先对对象进行封装(extends),或者使用ValueAnimator。
- 如果ObjectAnimator的工厂方法中的values... 参数提供了一个值(原本需要提供起始值和结束值),那么该值会被认为是结束值。起始值需要通过对象的getter方法提供,因此,在这种情况下,还需要提供对应属性的getter方法。
- 如果动画的对象是View,那么就可能需要在
onAnimationUpdate()
回调函数中
调用View.invalidate()方法来刷新屏幕的显示。比如说,设置Drawable对象的color属性。但是,View中的所有setter方法,如setAlpha()
andsetTranslationX()会自动地调用invalidate()方法,因此不需要额外地调用invalidate()方法。
使用AnimatorSet编排多个Animator
上面的代码片段,动画的执行顺序如下:
- 播放bounceAnim动画
- 同时播放
squashAnim1
,squashAnim2
,stretchAnim1
, andstretchAnim2
- 播放bounceBackAnim
- 播放fadeAnim
Animation监听器
Animator.AnimatorListener
onAnimationStart()
- 动画启动时调用onAnimationEnd()
- 动画结束时调用onAnimationRepeat()
- 动画重新播放时调用onAnimationCancel()
- 动画被Cancel时调用. 一个被Cancel的动画也会调用onAnimationEnd()
ValueAnimator.AnimatorUpdateListener
onAnimationUpdate()
- 在动画的每一帧上调用. 在这个方法中,你可以使用ValueAnimator的getAnimatedValue()方法来获取计算出来的值。当然,这个监听器一般只适用于ValueAnimator。值得注意的是,你可能需要在这个方法中调用View.invalidate()方法来刷新屏幕的显示。
另外,还可以继承适配器 AnimatorListenerAdapter来代替对Animator.AnimatorListener的接口的实现,那么就只需要实现你所关心的方法了。如:
ValueAnimatorAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animation) {
balls.remove(((ObjectAnimator)animation).getTarget());
}
动画在ViewGroup布局改变时的应用
LayoutTransition
上可以通过调用 setAnimator()方法来设置Animator,另外,还需要向这个方法传递一个 LayoutTransition标志常量,这个常量指示着在什么时候执行这个animator,可用的常量有:
APPEARING
- 指示layout中的view正要显示的时候运行动画CHANGE_APPEARING
- 指示layout中因为有新的view加入而改变layout时运行动画DISAPPEARING
- 指示layout中的view正要消失的时候运行动画CHANGE_DISAPPEARING
- 指示layout中有view消失而改变layout时运行动画
android:animateLayoutchanges
这个属性设置为true:
自定义Evaluator
IntEvaluator
, FloatEvaluator
, and ArgbEvaluator
这三种计算器都不能满足你的要求的时候,你可以通过实现 TypeEvaluator
接口的 evaluate()方法来自定义一个Evaluator。
下面是FloatEvaluator的evaluate()的实现:
自定义Interpolator
- AccelerateDecelerateInterpolator:
- LinearInterpolator:
使用Keyframes方式创建动画
使用ViewPropertyAnimator创建动画
- Multiple ObjectAnimator objects:
- One ObjectAnimator:
- ViewPropertyAnimator:
通过XML方式声明Animator
ValueAnimator
-<animator>
ObjectAnimator
-<objectAnimator>
AnimatorSet
-<set>
下面是res/animator/property_animator.xml的配置示例:
为了能够运行上面声明的animator,必须在代码中使用AnimatorInflater的inflate方法来实例化xml声明的animator,如:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.anim.property_animator);
set.setTarget(myObject);
set.start();
[Android Pro] Property Animation的更多相关文章
- Android动画效果之Property Animation进阶(属性动画)
前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- Android Property Animation动画
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...
- Android Animation学习(一) Property Animation原理介绍和API简介
Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...
- Android 属性动画(Property Animation) 完全解析 (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提 供了几种动画类型:View Anima ...
- 【转】Android 属性动画(Property Animation) 完全解析 (上)
http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Dra ...
- Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation
程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...
- Android(java)学习笔记263:Android下的属性动画(Property Animation)
1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...
- Android 属性动画(Property Animation) 全然解析 (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...
随机推荐
- ubuntu 10.04打开错误
打开ubuntu时,出现的错误如下: Invalid configuration file. File "E:\Ubuntu12.04.vmwarevm\Ubuntu12.04.vmx&qu ...
- python中烦人的锟斤拷(\xef\xbf\xbd)
首先要知道\xef\xbf\xbd是啥东西 >>> u'\uFFFD'.encode('utf-8') '\xef\xbf\xbd' 由此我们可以知道\xef\xbf\xbd是utf ...
- Linux下批量Kill多个进程的方法
转自http://www.jb51.net/LINUXjishu/43534.html ps -ef|grep tt.py|grep -v grep|cut -c 9-15|xargs kill -9 ...
- SnagIt截图后无法在编辑器打开,不显示截图内容的解决办法(转)
方法1: 用SnagIt截图后,弹出的编辑器里不显示刚才截图的内容,解决办法如下: 完全退出Snagit和编辑器,删除以下文件夹: Win7用户 C:\Users\Administrator\AppD ...
- Go语言标准包之用io包模拟curl
最后一个书上的标准包,但真正学习的路才开始... package main import ( "bytes" "fmt" "os" &quo ...
- 云平台学习--GitLab
今天和师父还有孙老师一起,两位大神给我讲了下全世界最先进的云平台架构(Tigzx). 废话不多说,直接说代码的GitLab 第一步: 访问路径:http://git.dlanqi.com:30503, ...
- 前端读者 | 关于存储及CSS的一些技巧
@羯瑞 HTML5存储 cookies 大小限制4K 发送在http请求头中 子域名能读取主域名的cookies 本地存储 localStorage sessionStorage 大小限制5M(注意超 ...
- git冲突解决的方法
在运行时,出现了冲突的报错.类似于<<<<<<< HEAD,在你改变的文件有分支与HEAD间的区别.这里就是冲突的地方. 1.解决方法一 使用命令 切换分支 ...
- Eclipse IDE下的Spring框架使用简单实例
Eclipse IDE下的Spring框架使用简单实例 1 准备Java jdk安装. Eclipse软件安装.根据系统安装32/64版本,选择Eclipse IDE for Java Develop ...
- HDU 6280 From Tree to Graph(2018 湘潭邀请 E题,树的返祖边)
其实打返祖边就相当于$x$到祖先这一段点(不包括两端)答案都要减$1$. 然后每个点最多减$1$次$1$. #include <bits/stdc++.h> using namespace ...