android动画

本博客供学习和交流使用 从事安卓开发也有一段时间了,之前从事开发的项目中也多次用到动画,一直想好好总结一下,梳理
一下相关知识。一直记得刚入行的时候一位师傅跟我说过一句话,做技术开发要懂得经常总结,这样才能
很快的得到提高。接下来,我会花上一段时间来总结一下,梳理一下脑海中的知识。一般安卓中将动画分为两大类:View Animation和 Property Animation 。其中,View Animation动画系统又可以分类成Tween Animation(补间动画) 和Frame Animation(帧动画)。
Tween Animation是通过对场景里的对象不断做图像变换(渐变、平移、缩放、旋转)产生动画效果,且这种动画只适用于view对象。
Frame Animation也是常用到的动画,它的原理比较简单,就是将一系列准备好的图片按照顺序播放,形成动画效果。
Property Animation(属性动画)是在Android3.0(API 11)之后引入的一种动画系统,该动画提供了比View
Animation更加丰富、强大和灵活的功能,Android官方推荐开发人员使用该动画系统来实现动画。
Property Animation的特点是动态地改变对象的属性从而达到动画效果。该动画实现使用于包括View在内的任何对象。
下面通过具体的事例深入分析和学习下各种动画的使用方法。
Tween Animation(补间动画) 通过上面的总结,我们知道补间动画只能实现对View的动画设置,可以实现下效果:

Alpha:渐变透明动画效果; Scale:渐变尺寸伸缩动画效果; Translate:位置位移动画效果; Rotate:位置旋转动画效果。

下面我们首先分别通过xml和代码实现View的Alpha动画效果。首先,我们使用xml来实现渐变效果,
首先,我们在res/目录下新建anim文件夹,在文件夹里新建文件view_alpha.xml文件,


android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2500"
android:repeatCount="5"
android:repeatMode="reverse"
/>

透明度控制动画效果 alpha
浮点型值:
fromAlpha 属性为动画起始时透明度
toAlpha 属性为动画结束时透明度
说明: 0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
repeatCount 重复次数
repeatMode 重复模式,有两种,一种是reverse,另一种是restart
代码中只需要

Animation mAnimation = AnimationUtils.loadAnimation(this, R.anim.view_alpha);
view.setAnimation(mAnimation);

这样就可以成功调用之前那设置的动画效果了。
【android动画】代码中设置Alpha属性,

Animation alphaAnimation = new AlphaAnimation(0.0f,1.0f);
alphaAnimation.setDuration(5000); // 设置动画持续时间为500毫秒
alphaAnimation.setFillAfter(true); // 设置动画结束后保持当前的位置(即不返回到动画开始前的位置)
alphaAnimation.setRepeatMode(Animation.REVERSE);
alphaAnimation.setRepeatCount(5);
alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
view.startAnimation(alphaAnimation);

运行效果如下,
android动画
文章图片

设置View 的Scale属性动画
同上在res/anim/下新建文件view_scale.xml。



android:duration="500"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="0"
android:toXScale="1.5"
android:toYScale="1.5" />

属性说明:
fromXDelta,fromYDelta 起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
toXDelta, toYDelta 动画结束时X,Y的座标
interpolator 指定动画插入器
fromXScale,fromYScale, 动画开始前X,Y的缩放,0.0为不显示, 1.0为正常大小
toXScale,toYScale, 动画最终缩放的倍数, 1.0为正常大小,大于1.0放大
pivotX, pivotY 动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从自身中间开始
startOffset, 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
duration,一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
repeatCount,动画重复的计数,动画将会执行该值+1次
repeatMode,动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变.
还需要在代码中调用动画文件文件才能生效。

Animation mAnimation=AnimationUtils.loadAnimation(this,R.anim.view_scale);
view.setAnimation(mAnimation);

之后的其他两种布局文件中设置动画,也是同样在代码中加载xml文件。所以,之后不再特别指出。

Animation scaleAnimation = new ScaleAnimation(0.0f, 1.5f, 0.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(5000); //设置动画持续时间为500毫秒
scaleAnimation.setFillAfter(true); //如果fillAfter的值为true,则动画执行后,控件将停留在执行结束的状态
scaleAnimation.setFillBefore(false); //如果fillBefore的值为true,则动画执行后,控件将回到动画执行之前的状态
scaleAnimation.setRepeatCount(3); //设置动画循环次数
scaleAnimation.setRepeatMode(Animation.REVERSE);
scaleAnimation.setStartOffset(0);
scaleAnimation.setInterpolator(this, android.R.anim.decelerate_interpolator); //设置动画插入器
mTextView.startAnimation(scaleAnimation);

android动画
文章图片

rotate画面旋转动画效果
在res/anim/新建文件view_rotate.xml


android:duration="5000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="-360" />

属性说明:
fromDegrees 动画开始时的角度
toDegrees 动画结束时物件的旋转角度,正代表顺时针
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置
在代码中设置如下,

Animation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(500);
rotateAnimation.setFillAfter(true);
rotateAnimation.setInterpolator(this, android.R.anim.accelerate_decel
erate_interpolator); //设置动画插入器
imageView.startAnimation(rotateAnimation);

效果如下,
android动画
文章图片

translate画面位置移动动画效果
同上,布局文件为res/anim/view_translate.xml


android:duration="5000"
android:fromXDelta="100"
android:fromYDelta="0"
android:interpolator="@android:anim/cycle_interpolator"
android:toXDelta="0"
android:toYDelta="0" />

属性说明:
fromXDelta,fromYDelta 起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
toXDelta, toYDelta 动画结束时X,Y的座标
代码中设置如下,

Animation translateAnimation = new TranslateAnimation(0, 100, 0, 0);
translateAnimation.setDuration(5000);
translateAnimation.setInterpolator(this, android.R.anim.cycle_interpolator);
//设置动画插入器
translateAnimation.setFillAfter(true); //设置动画结束后保持当前的位置(即不返
回到动画开始前的位置)
imageView.startAnimation(translateAnimation);

效果如下,
android动画
文章图片

今天就讲到这里,之后的帧动画和属性动画会在下篇博客中介绍。

    推荐阅读