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