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

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处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开发相关文章

你可能感兴趣的:(Pro Android学习笔记(一一三):2D动画(8):Property Animation(中))