参考资料《Android开发艺术探索》
Android的动画可以分为三种,View动画,帧动画和属性动画。
View动画
View动画的作用对象是View,它支持四种动画效果,分别是平移动画,缩放动画,旋转动画和透明度动画。
View动画的种类
View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation,ScaleAnimation,RotateAnimation和AlphaAnimation。这四种动画既可以通过XML方式表示,也可以通过代码创建,下面记录一下它的一些属性
android:interpolator
表示动画集合所采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程。这个属性可以不指定,默认为@android:anim/accelerate_decelerate_interpolator,即加速减速插值器。
android:shareInterpolator
表示集合中的动画是否和集合共享一个插值器。如果集合不指定插值器,那么自动画就需要单独指定所需的插值器或者使用默认值
<translate>标签标示平移动画,对应TranslateAnimation类,它可以使一个View在水平和竖直方向完成平移的动画效果,它的一系列属性的含义如下:
android:fromXDelta ——表示x的起始值,比如0;
android:toXDelta ——表示x的结束值,比如100;
android:fromYDelta ——表示y的起始值;
android:toYDelta ——表示y的起始值;
<scale>标签表示缩放动画,对应ScaleAnimation,它可以使View具有放大或者缩小的动画效果,它的一系列属性的含义如下:
android:fromXScale ——水平方向缩放的起始值,比如0.5;
android:toXScale ——水平方向缩放的结束值,比如1.2;
android:fromYScale ——竖直方向缩放的起始值;
android:toYScale ——竖直方向缩放的结束值;
android:pivotX ——缩放的轴点的x坐标,它会影响缩放的效果;
android:pivotY ——缩放的轴点的y坐标,它会影响缩放的效果;
<rotate>标签表示旋转动画,对于RotateAnimation,它可以使View具有旋转的动画效果,它的一系列属性的含义如下:
android:fromDegrees ——旋转开始的角度,比如0;
android:toDegrees ——旋转结束的角度,比如180;
android:pivotX ——旋转的轴点的x坐标;
android:pivotY ——旋转的轴点的y坐标;
<alpha>标签表示透明度动画,对应AlphaAnimation,它可以改变View的透明度,它的一系列属性的含义如下:
android:fromAlpha ——表示透明度的起始值,比如0.1;
android:toAlpha ——表示透明度的结束值,比如1;
除了上面介绍的属性以外,View动画还有一些常用的属性,如下:
android:duration ——动画的持续时间;
android:fillAfter ——动画结束以后View是否停留在结束位置,true表示View停留在结束位置,false则不停留;
View动画的特殊使用场景
出上面的几种形式外,View动画还可以在一些特殊的场景下使用,比如在ViewGroup中可以控制子元素的出场顺序,在Activity中可以实现不同Activity之间的切换效果。
LayoutAnimation
LayoutAnimation作用与ViewGroup,为ViewGroup指定一个动画,这样它的子元素出场时都会具有这种动画效果。这种效果常常被用在 ListView上。
Activity的切换效果
Activity有默认的切换效果,但是这个效果我们可以自己定义,主要用到
overridePendingTransition(int enterAnim,int exitAnim)这个方法,这个方法必须在 startActivity()或者finish()之后被调用才能生效,它的参数含义如下:
enterAnim ——Activity被打开时,所需要的动画资源id;
exitAnim ——Activity被暂停时,所需要的动画资源id;
属性动画
属性动画是API 11新加入的特性,和View动画不同,它对作用对象进行了扩展,属性动画可以对任何对象做动画,甚至还可以没有对象。
使用属性动画
属性动画可以对任意对象的属性进行动画而不仅仅是View,动画默认时间间隔300ms,默认帧率10ms/帧。其可以达到的效果是:在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。因此,属性动画几乎是无所不能的,只要对象有这个属性,他都能实现动画效果。
比较常用的几个动画类ValueAnimator,ObjectAnimator和AnimatorSet,其中ObjectAnimator继承自ValueAnimator,AnimatorSet是动画集合,可以定义一组动画,他们使用起来也是极其简单的。下面举例子使用属性动画。
(1)改变一个对象(button)的translationY属性,让其沿着Y轴向上平移一段距离:它的高度,该动画在默认时间内完成,动画的完成时间是可以定义的。想要更灵活的效果我们家可以定义插值器和估值算法,但是一般来说我们不需要自定义,系统已经预置了一些,能够满足常用的动画。
ObjectAnimator.ofFloat(button,"translationY",-button.getHeight()).start();
(2)改变一个对象的背景色属性,典型的情形是改变View的背景色,下面的动画就可以让背景色在3秒内实现从0xFFFF8080到0xFF8989FF的渐变,动画会无限循环而且会有反转效果
ValueAnimator colorAnim =ObjectAnimator.ofInt(button,"backgroundColor",0xFFFF8080,0xFF8989FF);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
(3)动画集合,5秒内对View的旋转,平移,缩放和透明度都进行了改变
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(button,"rotationX",0,360),
ObjectAnimator.ofFloat(button,"rotationY",0,180),
ObjectAnimator.ofFloat(button,"rotation",0,-90),
ObjectAnimator.ofFloat(button,"translationX",0,90),
ObjectAnimator.ofFloat(button,"translationY",0,90),
ObjectAnimator.ofFloat(button,"scaleX",1,1.5f),
ObjectAnimator.ofFloat(button,"scaleY",1,0.5f),
ObjectAnimator.ofFloat(button,"alpha",1,0.25f,1)
);
set.setDuration(5000).start();
}
});
当然属性动画也可以通过XML来实现
理解插值器和估值器
TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator(线性插值器:匀速动画),AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等。TypeEvaluator的中文翻译为类型估值算法,也叫估值器,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性),FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对Color属性)。属性动画中的插值器(Interpolator)和估值器(TypeEvaluator)很重要,它们是现实非匀速动画的重要手段。
网友评论