Android自定义控件:动画类----PropertyValuesHolder与Keyframe

Posted 优雅的心情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android自定义控件:动画类----PropertyValuesHolder与Keyframe相关的知识,希望对你有一定的参考价值。

相关文章:

Android自定义控件三部曲文章索引》:http://blog.csdn.net/harvic880925/article/details/50995268

前几篇给大家讲了ValueAnimator、ObjectAnimator的知识,讲解了它们ofInt(),ofFloat(),ofObject()函数的用法。细心的同学可能会注意到,ValueAnimator、ObjectAnimator除了这些创建Animator实例的方法以外,都还有一个方法:

[java]  view plain  copy  
  1. /** 
  2.  * valueAnimator的 
  3.  */  
  4. public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values)   
  5. /** 
  6.  * ObjectAnimator的 
  7.  */  
  8. public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)  
也就是说ValueAnimator和ObjectAnimator除了通过ofInt(),ofFloat(),ofObject()创建实例外,还都有一个ofPropertyValuesHolder()方法来创建实例,这篇文章我就带大家来看看如何通过ofPropertyValuesHolder()来创建实例的。 
由于ValueAnimator和ObjectAnimator都具有ofPropertyValuesHolder()函数,使用方法也差不多,相比而言,ValueAnimator的使用机会不多,这里我们就只讲ObjectAnimator中ofPropertyValuesHolder()的用法。相信大家懂了这篇以后,再去看ValueAnimator的ofPropertyValuesHolder(),也应该是会用的。 
在这篇文章的最后,我们通过本篇内容做了一个电话响铃的效果,效果图如下:

(录的图片效果不好,实际显示时抖的是更厉害的,大家可以看源码效果)

一、PropertyValuesHolder

1、概述

PropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。我们通过ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态。在封装成PropertyValuesHolder实例以后,后期的各种操作也是以PropertyValuesHolder为主的。 
说到这里,大家就知道这个PropertyValuesHolder是有多有用了吧,上面我们也说了,ObjectAnimator给我们提供了一个口子,让我们自己构造PropertyValuesHolder来构造动画。

[java]  view plain  copy  
  1. public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)  
PropertyValuesHolder中有很多函数,有些函数的api等级是11,有些函数的api等级是14和21; 
高api的函数我们就不讲了,只讲讲api 11的函数的用法。有关各个函数的api等级,大家可以参考 《Google文档:PropertyValuesHolder》 
首先,我们来看看创建实例的函数:
[java]  view plain  copy  
  1. public static PropertyValuesHolder ofFloat(String propertyName, float... values)  
  2. public static PropertyValuesHolder ofInt(String propertyName, int... values)   
  3. public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)  
  4. public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)  
这里总共有四个创建实例的方法,这一段我们着重讲ofFloat、ofInt和ofObject的用法,ofKeyframe我们单独讲。

2、PropertyValuesHolder之ofFloat()、ofInt()

(1)ofFloat()、ofInt()

我们先来看看它们的构造函数:
[java]  view plain  copy  
  1. public static PropertyValuesHolder ofFloat(String propertyName, float... values)  
  2. public static PropertyValuesHolder ofInt(String propertyName, int... values)   
其中:

  • propertyName:表示ObjectAnimator需要操作的属性名。即ObjectAnimator需要通过反射查找对应属性的setProperty()函数的那个property.
  • values:属性所对应的参数,同样是可变长参数,可以指定多个,还记得我们在ObjectAnimator中讲过,如果只指定了一个,那么ObjectAnimator会通过查找getProperty()方法来获得初始值。不理解的同学请参看《Animation动画详解(七)——ObjectAnimator基本使用》 
大家看这些参数是不是很眼熟,让我们看一下ObjectAnimator的ofFloat是怎么样的:
[java]  view plain  copy  
  1. public static ObjectAnimator ofFloat(Object target, String propertyName, float... values);  
看到没,在ObjectAnimator.ofFloat中只比PropertyValuesHolder的ofFloat多了一个target,其它都是完全一样的! 
好了,我们在讲完PropertyValuesHolder的ofFloat函数以后,我们再来看看如何将构造的PropertyValuesHolder实例设置进ObjectAnimator吧。 

(2)、ObjectAnimator.ofPropertyValuesHolder()

在开篇时,我们也讲了ObjectAnimator给我们提供了一个设置PropertyValuesHolder实例的入口:
[java]  view plain  copy  
  1. public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)   
其中:
  • target:指需要执行动画的控件
  • values:是一个可变长参数,可以传进去多个PropertyValuesHolder实例,由于每个PropertyValuesHolder实例都会针对一个属性做动画,所以如果传进去多个PropertyValuesHolder实例,将会对控件的多个属性同时做动画操作。 

(3)、示例

下面我们就举个例子来如何通过PropertyValuesHolder的ofFloat、ofInt来做动画的。 
效果图如下: 

这个动画很简单,就是在点击按钮的时候,给textView做动画,框架代码就不再讲了,我们主要来看看操作textview动画的代码。
动画代码为:
[java]  view plain  copy  
  1. PropertyValuesHolder rotationHolder = PropertyValuesHolder.ofFloat("Rotation", 60f, -60f, 40f, -40f, -20f, 20f, 10f, -10f, 0f);  
  2. PropertyValuesHolder colorHolder = PropertyValuesHolder.ofInt("BackgroundColor"0xffffffff0xffff00ff0xffffff000xffffffff);  
  3. ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mTextView, rotationHolder, colorHolder);  
  4. animator.setDuration(3000);  
  5. animator.setInterpolator(new AccelerateInterpolator());  
  6. animator.start();  
在这里,我们创建了两个PropertyValuesHolder实例,第一个rotationHolder:
[java]  view plain  copy  
  1. PropertyValuesHolder rotationHolder = PropertyValuesHolder.ofFloat("Rotation", 60f, -60f, 40f, -40f, -20f, 20f, 10f, -10f, 0f);  
使用ofFloat函数创建,属性值是Rotation,对应的是View类中SetRotation(float rotation)函数。后面传进去很多值,让其左右摆动。
第二是动画是改变背景色的colorHolder
[java]  view plain  copy  
  1. PropertyValuesHolder colorHolder = PropertyValuesHolder.ofInt("BackgroundColor"0xffffffff0xffff00ff0xffffff000xffffffff);  
这里使用的是ofInt函数创建的,它操作的属性是BackgroundColor,对应的是View类中的setBackgroundColor(int color)函数,后面传进去的16进制颜色值让其在这些颜色值间变化。有关颜色值的变化,大家可以参考《 Animation动画详解(七)——ObjectAnimator基本使用》 中第三部分《常用函数》 
最后通过ObjectAnimator.ofPropertyValuesHolder将rotationHolder、colorHolder设置给mTextView,构造出ObjectAnimator对象。然后开始动画即可
[java]  view plain  copy  
  1. ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mTextView, rotationHolder, colorHolder);  
  2. animator.setDuration(3000);  
  3. animator.setInterpolator(new AccelerateInterpolator());  
  4. animator.start();  
好了,到这里有关PropertyValuesHolder的ofInt和ofFloat函数的用法就讲完了,大家可以看到PropertyValuesHolder使用起来也很容易,下面我们再来看看PropertyValuesHolder的ofObject的使用方法。 
源码在文章底部给出

3、PropertyValuesHolder之ofObject()

(1)、概述

我们先来看一下ofObject的构造函数
[java]  view plain  copy  
  1. public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)  
  • propertyName:ObjectAnimator动画操作的属性名;
  • evaluator:Evaluator实例,Evaluator是将当前动画进度计算出当前值的类,可以使用系统自带的IntEvaluator、FloatEvaluator也可以自定义,有关Evaluator的知识,大家可以参考《Animation动画详解(五)——ValueAnimator高级进阶(一)》
  • values:可变长参数,表示操作动画属性的值 
它的各个参数与ObjectAnimator.ofObject的类似,只是少了target参数而已
[java]  view plain  copy  
  1. public static ObjectAnimator ofObject(Object target, String propertyName,TypeEvaluator evaluator, Object... values)  

(2)、示例

下面我们就讲讲PropertyValuesHolder.ofObject()函数的用法 
本示例的效果图如下:以上是关于Android自定义控件:动画类----PropertyValuesHolder与Keyframe的主要内容,如果未能解决你的问题,请参考以下文章

Android 自定义弹幕控件

Android 自定义弹幕控件

如何在Android中自定义动画

Android自定义View(9) 《动画 插值器简介》

android自定义view --视差动画

android自定义view --视差动画