0
点赞
收藏
分享

微信扫一扫

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


作者@恺风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动画小例子


举报

相关推荐

【Unity3D】2D动画

0 条评论