2018-05-20—属性动画(5)PropertyValueHolder和KeyFrame使用

大家好,不知不觉我们的属性动画已经说了这么多了,相信经过了这几章的学习,大家现在已经能做出很酷炫的效果了(至少比我做的酷炫吧应-。+)。

那我问大家一个简单的问题:构建属性动画对象有几种方式?

我们现在已经知道可以通过ofInt或这个ofFloat方法构建属性为整型和浮点型的属性动画;也知道可以通过ofObject来构建属性为对象的属性动画,但是要注意写自定义的估值器(指定中间值类型)。

但是我们还有一种没有学习——通过ofPropertyValueHolder方式构建属性动画对象。那我们这章的第一件事就是学习使用PropertyValueHolder来构建属性动画对象。

ValueAnimator通过PropertyValueHolder构建对象



PropertyValueHolder类:

这个翻译过来就是属性的拥有者。我们从ValueAnimator的构造方法中就可以看出来,只有PropertyValueHolder的可变长参数(ObjectAnimator等总体讲完了单拿出来讲解)。这个类中拥有者我们的属性和值。我们看一下他的构造方法就知道了:

从上面这张图就可以看出他的构建实例的方法不是一般的多。下面我给大家罗列出来到目前为止我们已经可以用的几个构建方法:



public static PropertyValueHolder ofInt(String propertyName,int ... values)

public static PropertyValueHolder ofFloat(String propertyName,float... values)

public static PropertyValueHolder ofObject(String propertyName,TypeEvaluator evaluator,Object ... values)

public static PropertyValueHolder ofKeyFrame(String propertyName,KeyFrame ... values)



以上便是我们经常用到的四种方法。相信关于前三种的样式大家看着应该都不太陌生,只是第四个不知道是什么。不着急,等会儿我们就说它,我们先看前三个。

propertyName:这个就是对象的属性值,没什么好说的,在我们ObjectAnimator中我们我们就见过。

values:这个值是我们要添加属性值,相信也不用多说什么。

evaluator:这个属性是我们的估值器,当我们使用ofObject方法构建时候,就需要我们自定义的TypeEvaluator了。

接下来我们通过PropertyValueHolder来构建一个属性动画对象。为了方便,我还是用上一次的小球的动画效果啦!!!

我们发现只需要修改animationStart方法就可以了。

大体上代码没什么变化,逻辑大家都能看懂,唯一变化的就是我在坐标变化同时,加上了半径的变化,我们在意的就是PropertyValueHolder这个对象。

我们通过ofObject这个方法构建的PropertyValueHolder对象,propertyName参数我给他置空了,因为我们使用ValueAnimator方法,所以propertyName一般情况下也用不到。当然这个也是可以用到的,等会儿我们用。

然后就是添加估值器和value了。

最后我们看一下效果:

好了,现在我们要给他添加两个PropertyValueHolder对象,新添加的PropertyValueHolder用来实现透明度的变化。


我们创建了新的PropertyValueHolder对象,然后在onAnimationUpdate中添加了透明度的变换。效果如下:

现在我们知道propertyName属性的作用了吧,在ValueAnimator中,在我们需要制定多个PropertyValueHolder时候,可以通过指定不同的propertyName名字,来规定不同的属性。(注:在ObjectAnimator中跟这个使用方法完全不一样,不要混了)

现在相信我们已经会用PropertyValueHolder来构建动画对象了。


KeyFrame

记得刚才我们还说可以通过ofKeyFrame方法来构建PropertyValueHolder对象。现在我们来看一下这个KeyFrame类。

在此之前,我想问大家,我们学了这个久的属性动画,大家知道改变我们动画速率变化的有哪几种方式吗?

目前为止,控制我们动画速率的有两种方式:

1.自定义插值器,通过数学变换实现。

2.自定义估值器,通过数学变换实现。

这两种使用到数学公式和算法的,一些简单的速率控制还可以,一旦复杂,我想大家那些数学知识应该已经还给老师了吧-。+

我们的gg似乎已经考虑到了这一点,给我们弄了一个轻松控制速率的类——KeyFrame类。(:其实KeyFrame一直都有用,只是我们以前的方法把他封装了,具体的等笔者在属性动画源码篇会详细介绍)

这个类英文直译过来就是关键帧的意思。顾名思义,他是指在关键的地方指定的帧数。换句话可以这么说——指定动画进行到的特定地方,进行到的值。

可能话说的有点拗口,那我们直接看他的构造方法,就一目了然了。

我们看到他的构建方法不多,只是简单地三种:ofFLoat、ofInt、ofObject。而每一种都有两个方法,一个是参数之后fraction的,还有一个是参数是fraction和value的。

在这里我要强调一下:对于KeyFrame而言,我们的fraction和value是必须有的。。

现在我们来用一下这个来构建一下PropertyValueHolder:

我们只是更改了startValuesHolder的构建,关于alphaValuesHolder没有任何变化。

我们创建了三个KeyFrame,分别是在起始,中间和结束的三种状态,以及对应的值,相信这么说大家知道只是什么意思了:

起始在(100,100)位置,当动画进行到一半时,他到达(500,500)位置,最后结束时又回到(100,100)位置。

我们看一下效果:

相信现在关于KeyFrame的使用大家也没有问题了。



最后给大家总结一下构建属性动画的方式:



好了,到现在位置,我们属性动画的大多部分都讲完了,但是以上我们几乎都是通过ValueAnimator类实现的。所以下一章我们将会详细讲解一下属性动画中的ObjectAnimator类。以及比较一下ValueAnimator和ObjectAnimator类的不同。

你可能感兴趣的:(2018-05-20—属性动画(5)PropertyValueHolder和KeyFrame使用)