Android属性动画学习笔记(二)

Android属性动画学习笔记(二)

上一篇文章中记录了一下属性动画的基础用法,这篇文章主要记录下高级用法。

TypeEvaluator

通过之前的学习,我们知道了,属性动画可以直接改变对象的某个属性,来达到动画的效果。在上一篇文章的例子中,我们通过ofFloat()方法来改变了float类型的某一属性,进而完成动画。但我们也知道,属性动画和补间动画相比一大优势就是它可以对我们自定义的一些属性使用,那要怎样才能实现呢?
上一篇中我们说过,属性动画的实现要经过两个步骤:
1.计算属性值
2.根据属性值的改变进行相应操作
这里要提出一个新的东西,TypeEvaluator。通过这个TypeEvaluator我们可以完成某一属性从开始值到结束值的过度,也就是前面说的第一个步骤,计算属性值。所以我们要实现自定义的TypeEvaluator来达到我们对自定义属性修改的目的。而实际上,前面说的ofFloat()也是使用了一个系统中内置的FloatEvaluator来达到这一目的的。

相关的例子代码我就不贴了,可以参考大神文章
http://blog.csdn.net/guolin_blog/article/details/43816093
这里面有两个例子,分别是对于ValueAnimator和ObjectAnimator的。这里我主要是在大神给的例子上做了一些修改,来解决我自己的一点小问题。

开始学习属性动画的时候,对于几个概念一直有点混淆。ValueAnimator和ObjectAnimator分别在什么情况下使用?什么时候需要用自定义的TypeEvaluator?
在上面大神的两个例子中,都用到了自定义的TypeEvaluator,但在使用ValueAnimator时是通过ValueAnimator.AnimatorUpdateListener的onAnimationUpdate的回调来获取属性变化状态,进而进行处理,ObjectAnimator的例子中则是没有这一步骤。所以我猜想,如果我在第一个例子中,把point看作是MyAnimView的一个属性,并给它一个setter方法,去掉添加的ValueAnimator.AnimatorUpdateListener,是不是也可以完成动画?自己试了一下确实是可以的。在这边记录一下,以防以后忘记。对这些东西的概念也更清楚了一些。

TimeInterplator

TimeInterplator定义了属性值变化的方式,控制属性的变化速率。在Property Animation中是TimeInterplator,在View Animation中是Interplator,这两个是一样的,在3.0之前只有Interplator,3.0之后实现代码转移至了TimeInterplator。Interplator继承自TimeInterplator,内部没有任何其他代码。用法就是通过setInterpolator()方法。
使用属性动画时,系统默认的Interpolator其实就是一个先加速后减速的Interpolator,对应的实现类就是AccelerateDecelerateInterpolator。
系统给我们提供了很多现成的TimeInterplator:

AccelerateInterpolator          加速,开始时慢中间加速
DecelerateInterpolator         减速,开始时快然后减速
AccelerateDecelerateInterolator    先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator        反向 ,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator    反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
BounceInterpolator         跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator         循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator         线性,线性均匀改变
OvershottInterpolator        回弹,最后超出目的值然后缓慢改变到目的值
TimeInterpolator           一个接口,允许你自定义interpolator,以上几个都是实现了这个接口

自定义TimeInterplator这里就不贴了。用到的时候度娘吧。

ViewPropertyAnimator

如果需要对一个View的多个属性进行动画可以用ViewPropertyAnimator类,该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图,该类在3.1中引入。通过这个方法显然可以使对View的动画操作更简单。
以下两段代码实现同样的效果: 

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
myView.animate().x(50f).y(100f);

可以看到,使用了ViewPropertyAnimator真的是简单了很多,另外也有一些需要注意的点:

  1. 整个ViewPropertyAnimator的功能都是建立在View类新增的animate()方法之上的,这个方法会创建并返回一个ViewPropertyAnimator的实例,之后的调用的所有方法,设置的所有属性都是通过这个实例完成的
  2. 大家注意到,在使用ViewPropertyAnimator时,我们自始至终没有调用过start()方法,这是因为新的接口中使用了隐式启动动画的功能,只要我们将动画定义完成之后,动画就会自动启动。并且这个机制对于组合动画也同样有效,只要我们不断地连缀新的方法,那么动画就不会立刻执行,等到所有在ViewPropertyAnimator上设置的方法都执行完毕后,动画就会自动启动。当然如果不想使用这一默认机制的话,我们也可以显式地调用start()方法来启动动画。
  3. ViewPropertyAnimator的所有接口都是使用连缀的语法来设计的,每个方法的返回值都是它自身的实例,因此调用完一个方法之后可以直接连缀调用它的另一个方法,这样把所有的功能都串接起来,我们甚至可以仅通过一行代码就完成任意复杂度的动画功能。

    参考大神文章:
    http://blog.csdn.net/guolin_blog/article/details/44171115
    http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值