视图动画只是在视图上产生动画效果,View的属性(位置、大小、角度等)实际并未发生变化。Android中提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四种实现视图动画效果的API,同时提供了AnimationSet来实现动画集合,以便混合使用多种动画。以下示例对一个命名为mTestView的View使用AlphaAnimation动画效果,其他动画使用方式与此相同。
1. AlphaAnimation示例:
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(2000);
mTestView.startAnimation(alphaAnimation);
//添加动画监听回调
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
2. 使用AnimationSet混合多种动画效果
AnimationSet animationSet = new AnimationSet(true);
AlphaAnimation alphaAnimation1 = new AlphaAnimation(0, 1);
alphaAnimation1.setDuration(2000);
animationSet.addAnimation(alphaAnimation1);
TranslateAnimation translateAnimation1 = new TranslateAnimation(0, 200, 0, 200);
translateAnimation1.setDuration(2000);
animationSet.addAnimation(translateAnimation1);
mTestView.startAnimation(animationSet);
属性动画是Android 3.0之后添加的动画框架,最经常使用的是AnimatorSet和ObjectAnimator的配合。ObjectAnimator可以精细化控制一个对象的一个属性值,实现动画效果的同时也改变动画对象的相应属性。AnimatorSet可以组合多个ObjectAnimator,实现多动画混合。
1. ObjectAnimator的使用
//参数一:要操纵的view;
//参数二:要操纵的属性(translationX、translationY、rotationX、rotationY、rotation、scaleX、scaleY)
//参数三:可变数组参数,代表属性变化的一个取值过程。
ObjectAnimator translationX = ObjectAnimator.ofFloat(mTestView, "translationX", 300);
translationX.setDuration(500);
translationX.start();
2. PropertyValuesHolder:对同一对象的多个属性同时作用多种动画
示例:在平移过程中同时进行缩放
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f,1.5f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f);
ObjectAnimator.ofPropertyValuesHolder(mTestView, pvh1, pvh2, pvh3).setDuration(2000).start();
3. AnimatorSet:组合多个动画,并且能够对多个动画进行精确的顺序控制。
示例:按顺序执行3个动画:首先平移mTestView,然后mBtnAnimatorSet横向缩放,最后mBtnAnimatorSet纵向缩放
ObjectAnimator translationX1 = ObjectAnimator.ofFloat(mTestView, "translationX", 300);
ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(mBtnAnimatorSet, "scaleX", 1.5f);
ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(mBtnAnimatorSet, "scaleY", 1.5f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playSequentially(translationX1, scaleX1, scaleY1);
animatorSet.start();
4. 使用View的animate方法实现属性动画
Android 3.0之后,View增加的animate方法来直接实现属性动画。
mTestView.animate()
.scaleX(1.5f)
.x(300)
.setDuration(1000)
.withStartAction(new Runnable() {
@Override
public void run() {
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
}
}).start();
5. 布局动画
布局动画作用在布局上,当给布局添加view时,会添加一个动画过渡效果。如:给一个RelativeLayout添加一个AlphaAnimation,该布局中的view会以AlphaAnimation的动画效果出现。
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(3000);
LayoutAnimationController lac = new LayoutAnimationController(aa, 1f);
//LayoutAnimationController.ORDER_NORMAL:布局中的view按顺序出现
//LayoutAnimationController.ORDER_RANDOM:布局中的view按随机顺序出现
//LayoutAnimationController.ORDER_REVERSE:布局中的view反序出现
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
mTestLayout.setLayoutAnimation(lac);