首页

源码搜藏网

首页 > 开发教程 > 手机开发 >

android动画——属性动画(Property Animation)

创建时间:2016-07-01 16:59  

视图动画请移步:http://blog.csdn.net/u013424496/article/details/51700077

相对与视图动画 ,属性动画(android3.0提出的) 使用条件:

完全弥补了View anim System的缺陷,你可以为一个对象的任何属性添加动画,(View或者非View),同时对象自己也会被修改。
并且当属性变化的时候,property Anim系统会自动的刷新屏幕。
属性动画系统在处理动画方面也更加强劲。更高级的,你可以指定动画的属性,比如颜色,位置,大小,定义动画的插值器并且同步多个动画。
并且在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。而且Property Animation不止可以应用于View,还可以应用于任何对象。

图解类结构

android动画——属性动画(Property Animation)
我们就这幅图来说说属性动画吧:

Animator

属性动画主要的类都在android.animation命名空间下,Animator是属性动画的基类,其是一个抽象类,该类定义了许多重要的方法,如下所示:


ValueAnimator

ValueAnimator继承自抽象类Animator。要让属性动画渐变式地更改对象中某个属性的值,可分两步操作:第一步,动画需要计算出某一时刻属性值应该是多少;第二步,需要将计算出的属性值赋值给动画的属性。ValueAnimator只实现了第一步,也就是说ValueAnimator只负责以动画的形式不断计算不同时刻的属性值,但需要我们开发者自己写代码将计算出的值通过对象的setXXX等方法更新对象的属性值。

ValueAnimator中有两个比较重要的属性,一个是TimeInterpolator类型的属性,另一个是TypeEvaluator类型的属性。TimeInterpolator指的就是时间插值器,在上面我们已经介绍过,在此不再赘述。TypeEvaluator是什么呢?TypeEvaluator表示的是ValueAnimator对哪种类型的值进行动画处理。ValueAnimator提供了四个静态方法ofFloat()、ofInt()、ofArgb()和ofObject(),通过这四个方法可以对不同种类型的值进行动画处理,这四个方法对应了四种TypeEvaluator,下面会详细说明。


ObjectAnimator

ObjectAnimator继承自ValueAnimator。我们之前提到,要让属性动画渐变式地更改对象中某个属性的值,可分两步操作:第一步,动画需要计算出某一时刻属性值应该是多少;第二步,需要将计算出的属性值赋值给动画的属性。ValueAnimator只实现了第一步,也就是说ValueAnimator只负责以动画的形式不断计算不同时刻的属性值,但需要我们开发者自己写代码在动画监听器AnimatorUpdateListener的onAnimationUpdate方法中将计算出的值通过对象的setXXX等方法更新对象的属性值。ObjectAnimator比ValueAnimator更进一步,其会自动调用对象的setXXX方法更新对象中的属性值。

ObjectAnimator重载了ofFloat()、ofInt()、ofArgb()和ofObject()等静态方法,我们下面依次说明。


AnimatorSet

AnimatorSet继承自Animator。AnimatorSet表示的是动画的集合,我们可以通过AnimatorSet把多个动画集合在一起,让其串行或并行执行,从而创造出复杂的动画效果。

我们想让TextView先进行旋转,然后进行平移,最后进行伸缩,我们可以通过AnimatorSet实现该效果,代码如下所示:

```
    //anim1实现TextView的旋转动画
    Animator anim1 = ObjectAnimator.ofFloat(textView, "rotation", 0f, 360f);
    anim1.setDuration(2000);
    //anim2和anim3TextView的平移动画
    Animator anim2 = ObjectAnimator.ofFloat(textView, "translationX", 0f, 300f);
    anim2.setDuration(3000);
    Animator anim3 = ObjectAnimator.ofFloat(textView, "translationY", 0f, 400f);
    anim3.setDuration(3000);
    //anim4实现TextView的伸缩动画
    Animator anim4 = ObjectAnimator.ofFloat(textView, "scaleX", 1f, 0.5f);
    anim4.setDuration(2000);


    //第一种方式
    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playSequentially(anim1, anim2, anim4);
    animatorSet.playTogether(anim2, anim3);
    animatorSet.start();

    //第二种方式
    /*AnimatorSet anim23 = new AnimatorSet();
    anim23.playTogether(anim2, anim3);
    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.playSequentially(anim1, anim23, anim4);
    animatorSet.start();*/

    //第三种方式
    /*AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.play(anim1).before(anim2);
    animatorSet.play(anim2).with(anim3);
    animatorSet.play(anim4).after(anim2);
    animatorSet.start();*/
```

效果如下所示: 
android动画——属性动画(Property Animation)

动画anim1用于旋转TextView,anim2用于在X轴方向偏移TextView,anim3用于在Y轴方向偏移TextView,anim4用于缩放TextView。我们在以上代码中提供了三种方式通过AnimationSet把这四个动画组合到一起,第二种方式和第三种方式被注释起来了。

其实有很多种办法实现上述效果,这里只介绍一下上述三种方式的思路。

  1. 在第一种方式中,调用了animatorSet.playSequentially(anim1, anim2, anim4),该方法将anim1、anim2以及anim4按顺序串联起来放到了animatorSet中,这样首先会让动画anim1执行,anim1执行完成后,会依次执行动画anim2,执行完anim2之后会执行动画anim3。通过调用animatorSet.playTogether(anim2, anim3),保证了anim2和anim3同时执行,即动画anim1完成之后会同时运行anim2和anim3。

  2. 在第二种方式中,我们首先创建了一个AnimatorSet变量anim23,然后通过anim23.playTogether(anim2, anim3)将anim2和anim3组合成一个小的动画集合。然后我们再把anim1、anim23以及anim4一起传入到animatorSet.playSequentially(anim1, anim23, anim4)中,这样anim1、anim23、anim4会依次执行,而anim23中的anim2和anim3会同时执行。该方式同时也演示了可以将一个AnimatorSet作为动画的一部分放入另一个AnimatorSet中。

  3. 在第三种方式中,我们使用了AnimatorSet的play方法,该方法返回AnimatorSet.Builder类型,animatorSet.play(anim1).before(anim2)确保了anim1执行完了之后执行anim2,animatorSet.play(anim2).with(anim3)确保了anim2和anim3同时执行,animatorSet.play(anim4).after(anim2)确保了anim2执行完了之后执行anim4。需要说明的是animatorSet.play(anim1).before(anim2)与animatorSet.play(anim2).after(anim1)是完全等价的,之所以在上面代码中有的写before,有的写after,只是为了让大家多了解一下API。

结尾总结下:Translate,Alpha,Scale,Rotate这几种动画的一些属性

Translate

对应的属性名为TranslateX和TranslateY

TranslateX:参考轴为Y轴
如果value < 0 则位于Y轴的左侧。
如果value > 0 则位于Y轴的右侧。

TranslateY:参考轴为X轴
如果value < 0 则位于X轴的下方。
如果value > 0 则位于X轴的上方。

Scale

对应的属性名为 ScaleX、ScaleY
android:pivotX
android:pivotY
value 为缩放比例

Rotate:对于的属性名为rotation

android:pivotX 旋转中心X坐标
android:pivotY 旋转中心Y坐标
rotation: value 为旋转角度
value > 0 在参考位置的顺时针方向
value < 0 在参考位置的逆时针方向
如果不设置privotX和privotY,默认是Target的中心为缩放坐标

ObjectAnimator.ofFloat(target, “rotation”, -90, 0),
ObjectAnimator.ofFloat(target, “pivotX”, x, x),
ObjectAnimator.ofFloat(target, “pivotY”, y, y)
这里从逆时针方向90度以X和Y为中心坐标,旋转到目标位置
为了整个过程的时序上保持一致。所以这里privotX和privotY与rotation的参数都为2,旋转中心始终不变

Alpha

0.0表示完全透明,1.0表示完全不透明,Float值。
这个动画比较简单,只是使用的时候,参数值的设置,可以达到不同的效果。
比如Bling Bling的效果:
ObjectAnimator.ofFloat(target,”alpha”,1,0,1,0,1)



参考文档:http://blog.csdn.net/iispring/article/details/50322625

http://www.lightskystreet.com/2014/12/04/propertyview-anim-analysis/

Translate,Alpha,Scale,Rotate这几种动画的一些属性更多介绍

0
0
   
上一篇:避免滥用单例
下一篇:android流式布局:FlexboxLayout用法探析(一)

相关内容

热门推荐