android 的属性动画有几种:View Animation,Property Animation,Drawable Animation。
因为View Animation的太过简单,只能提供:缩放,平移,旋转,透明度的改变。有一定的局限性(比如如果要实现颜色改变,3d
旋转)。Property Animation 应运而生正好弥补了这一缺憾。它的功能更为强大!
Property Animation 表示的是动态的改变对象的属性,来达到动画的效果。
要使用Property Animation必须用到下面几个类:
ObjectAnimator, 动画执行类。封装一个view的一个动画动作。
ValueAnimator 动画执行类。封装value的变化。(通过addAnimationListener(AnimationListener l))来完成动画的效果。
AnimtorSet 用于控制一组动画的执行,线性、一起、每个动画的先后执行。
AnimatorInflater 用户加载属性动画 的xml文件。
TimeInterpalater 定义了动画的变化率。
下面我一个一个介绍:
一,ObjectAnimator
1,先看一个简单的应用
ObjectAnimator.ofFloat(iv_aa,"rotationX",0.0f,360f)//
.setDuration(2000)//
.start();
ObjectAnimator提供了ofFloat,ofInt,ofObject等方法来设置,动画作用对象(View),属性名(rotationX),初始值,结束值,
即一系列的中间值!
对于属性的值,如果只有一个属性值,则默认对象当前的属性值为初始值,设置的属性值为结束值;如果有两个属性值,则第一
个为初始值,最后一个为结束值。
其实在整个动画的过程中,实际是不断地利用get,set方法改变其属性值,从而达到动画的效果。所以对于该属性(rotationX),
必须有get,set方法。
2,上面的动画只是实现了一个动画效果。就是以X轴为中心旋转。如果要变选装变缩放呢?
有人可能第一个想到的是AnimatorSet类。很好,说明你可能有比较熟悉Drawable Animation因为,Drawable Animation中set可以
实现多种动画,一起执行的小效果。但是这里我们用ObjectAnimator+AnimtorUpdateListener;
ObjectAnimator oAnimator=ObjectAnimator
.ofFloat(iv_aa, "wang", 1.0f,0.0f,1.0f)
.setDuration(3000);//
oAnimator.setRepeatCount(ObjectAnimator.INFINITE);
oAnimator.start();
oAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float val=(Float) animation.getAnimatedValue();
iv_aa.setRotationX(val*360);
iv_aa.setScaleX(val);
iv_aa.setScaleY(val);
}
});
这里我用了一个不存在的属性“wang”,然后设定它的属性值。核心在后面,我们利用AnimatorUpdateListener监听器属性的
改变,然后手动的改变它其他多个属性的值。就达到了多种动画的效果。
3,ObjectAnimator还有一种用法。同样的效果。
PropertyValuesHolder rotationX
=PropertyValuesHolder.ofFloat("rotationX", 360.0f,0.0f,360.0f);
PropertyValuesHolder scaleX
=PropertyValuesHolder.ofFloat("scaleX", 1.0f,0.0f,1.0f);
PropertyValuesHolder scaleY
=PropertyValuesHolder.ofFloat("scaleY", 1.0f,0.0f,1.0f);
ObjectAnimator.ofPropertyValuesHolder(iv_aa,rotationX,scaleX,scaleY)
.setDuration(3000).start();
二,ValueAnimator的使用
1,同样是上面的效果:
ValueAnimator vAnimator
=ValueAnimator.ofFloat(1.0f,0.0f,1.0f)
.setDuration(3000);
Animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float val=(Float) animation.getAnimatedValue();
iv_aa.setRotationX(val*360);
iv_aa.setScaleX(val);
iv_aa.setScaleY(val);
}
});
vAnimator.start();
ValueAnimator表示的仅仅是值得改变,属性的变化都是在AnimatorUpdateListener中改变的。
2,ValueAnimator,重写TypeValue
ValueAnimator vAnim=new ValueAnimator();
vAnim.setInterpolator(new LinearInterpolator());
vAnim.setObjectValues(new PointF(0, 0));
vAnim.setDuration(3000);
vAnim.setEvaluator(new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
Log.i("wangsongbin",""+fraction);//fraction:0~1;
Screen screen=null;
screen=UtilScreen.getWindowScreenPix(DrawableAnimActivity.this);
PointF pointf=new PointF();
pointf.x=fraction*screen.width;
pointf.y=fraction*fraction*screen.height;
return pointf;
}
});
vAnim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF pf=(PointF) animation.getAnimatedValue();
iv_aa.setX(pf.x);
iv_aa.setY(pf.y);
}
});
vAnim.start();
先看一段代码:
ObjectAnimator oAnimator1=ObjectAnimator.ofFloat(iv_aa, "scaleX", 1.0f,0.0f,1.0f).setDuration(2000);
ObjectAnimator oAnimator2=ObjectAnimator.ofFloat(iv_aa, "scaleY", 1.0f,0.0f,1.0f).setDuration(2000);
ObjectAnimator oAnimator3=ObjectAnimator.ofFloat(iv_aa, "rotationX", 360.0f,0.0f,360.0f).setDuration(2000);
AnimatorSet animSet=new AnimatorSet();
animSet.play(oAnimator1).with(oAnimator2);
animSet.play(oAnimator3).after(oAnimator1);
animSet.start();
相信结合了上面的代码,大家能更直观的了解AnimatorSet的作用,AnimatorSet用于
管理多个动画的执行先后顺序!
四,property Animation(属性动画)的xml方式定义:res/animtor/set.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">//表示一起执行,sequentially,表示顺序执行
<objectAnimator
android:propertyName="scaleX"
android:interpolator="@android:anim/linear_interpolator"
android:duration="2000"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType">
</objectAnimator>
<objectAnimator
android:propertyName="scaleY"
android:interpolator="@android:anim/linear_interpolator"
android:duration="2000"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType">
</objectAnimator>
</set>
利用xml定义的属性动画,要利用AnimatorInflater.loadAnimator(..)方法加载,就像Drawable Animation要用AnimationUtil加载一样。
如下:
AnimatorSet animSet=(AnimatorSet) AnimatorInflater
.loadAnimator(DrawableAnimActivity.this, R.animator.set);
animSet.setTarget(iv_aa);
animSet.start();
五,LayoutTransition(布局动画)
表示当视图图层的位置发生改变时的过渡动画。
gridLayout=new GridLayout(this);
gridLayout.setColumnCount(5);
LayoutTransition lt=new LayoutTransition();
//ObjectAnimator alpha=ObjectAnimator.ofFloat(target, propertyName, values)
lt.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofFloat(null, "alpha", 0.0f,1.0f));
lt.setAnimator(LayoutTransition.CHANGE_APPEARING, lt.getAnimator(LayoutTransition.CHANGE_APPEARING));
lt.setAnimator(LayoutTransition.DISAPPEARING, lt.getAnimator(LayoutTransition.DISAPPEARING));
lt.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, lt.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));
gridLayout.setLayoutTransition(lt);
rl.addView(gridLayout);
如上所示,上面有四种状态:
LayoutTransition.APPEARING view出现时自身的动画
<pre name="code" class="java">LayoutTransition.CHANGE_APPEARING view出现时,其他视图的动画
LayoutTransition.DISAPPEARING view消失时,自身的动画
<pre name="code" class="java">LayoutTransition.CHANGE_DISAPPEARING view消失时,其他视图的动画
动画你可以用自定义的:ObjectAnimator.ofFloat(null, "alpha", 0.0f,1.0f)
也可以用系统自带的动画:lt.getAnimator(LayoutTransition.CHANGE_APPEARING);