您的位置:首页 > 移动开发 > Android开发

Pro Android学习笔记(一一三):2D动画(8):Property Animation(中)

2014-08-06 11:10 453 查看
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying以及作者@恺风Wei

AnimatorSet

在ObjectAnimation的例子中,我们给出了某个动画,我们可以通过监听AniamtorListener,在某个动画结束之际,开启下一个动画,我们可以直接使用AnimationSet来设置一组动画,实现同样的效果。

public void sequentialAnimation(View v){

ObjectAnimator fadeOut = ObjectAnimator.ofFloat(tv, "alpha", 0.0f);

ObjectAnimator fadeIn = ObjectAnimator.ofFloat(tv, "alpha", 1.0f);



AnimatorSet as = new AnimatorSet();

as.playSequentially(fadeOut,fadeIn); //可以带多个参数,依次执行

as.setDuration(5000); //相当于fadeOut.setDuration(5000); fadeIn.setDuration(5000);

as.start();

}
小例子会先执行5秒的淡出,然后执行5秒的淡入。AnimationSet通过playSequentailly()执行多个动画的串行效果,通过playTogether()执行多个动画的并行效果。

AnimatorSet.Builder

AnimatorSet可以实现并行或串行的变化。我们还可以利用Animator.Builder实现更为精细的控制,代码片段如下:

public void builderAnimation(View v){

ObjectAnimator fadeOut = ObjectAnimator.ofFloat(tv, "alpha", 0.0f);

ObjectAnimator fadeIn = ObjectAnimator.ofFloat(tv, "alpha", 1.0f);



AnimatorSet as = new AnimatorSet();

//as.play(animator)返回一个AnimatorSet.Builder对象,Builder是一个工具栏,提供方法有after(animator),before(animator)和with(animator),而这些方法的返回值也是Builder,因此我们可以继续进行相关的操作。

as.play(fadeOut).before(fadeIn);


as.setDuration(5000);

as.start();

}

AnimatorInfalter和XML文件

可以通过XML文件定义ObjectAnimator、AnimatorSet、ValueAnimator(xml的tag为animator)。虽然没有强制要求,但是一般该XML文件位于res/animator目录之下。

<?xml version="1.0" encoding="utf-8"?>

<set android:ordering="sequentially"

xmlns:android="http://schemas.android.com/apk/res/android" >

<objectAnimator android:interpolator="@android:interpolator/accelerate_cubic"

android:valueFrom="1.0"

android:valueTo="0.0"

android:valueType="floatType"

android:propertyName="alpha"

android:duration="5000" />

<objectAnimator android:interpolator="@android:interpolator/accelerate_cubic"

android:valueFrom="0.0"

android:valueTo="1.0"

android:valueType="floatType"

android:propertyName="alpha"

android:duration="5000" />

</set>
相关的代码片段如下:

public void xmlAnimation(View v){

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.fade);

set.setTarget(tv);


set.start();

}

PropertyValuesHolder

在前面的例子中,我们只对单一的属性alpha进行渐变,我们也学习了可以让多个动画并行进行的方法。PropertyValuesHolder提供了另一并行方法,在每次变化中,可以一次性修改相应的属性,比之前的并行动画要更为高效,下面是例子的代码片段:

public void pvHolderTest(View v){

//获取当前状态

float h = tv.getHeight();

float w = tv.getWidth();

float x = tv.getX();

float y = tv.getY();

Log.v("WEI","current : heigth=" + h + " width=" + w + " x=" + x + " y=" + y);



//设置初始值:将view初始位置放在右下角,并设置为不可视

tv.setX(w);

tv.setY(h);

tv.setAlpha(0.0f);



//通过PropertyValuesHolder设置目标值,分别针对x,y和alpha三个属性进行设置

PropertyValuesHolder pvX = PropertyValuesHolder.ofFloat("x", x);

PropertyValuesHolder pvY = PropertyValuesHolder.ofFloat("y", y);

PropertyValuesHolder pvA = PropertyValuesHolder.ofFloat("alpha", 1.0f);

//通过ObjectAnimator.ofPropertyValuesHolder()可以同时设置多个目标值

ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(tv,pvX,pvY,pvA);


oa.setDuration(5000);

oa.setInterpolator(new AccelerateDecelerateInterpolator());

oa.start();

}

小例子代码在:Pro Android学习:2D动画小例子
相关链接:我的Android开发相关文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: