国庆长假,出去溜达了一圈人满为患,发现还是回来敲代码最实在。
完整代码请戳这里Android动画Demo
临近毕业之际,
总结了一年多来学习Android的知识体系,发现Android动画这
一块还是我的软肋。
所以决定国庆这几天花点时间来学学Android动画,由于本人
是新手以下所写内容仅仅是我个人笔记,如有错漏,望见谅!
Android动画总共可以分为两大类
分别是
Property Animation和
View Animation,而View Animation又细化分
为Tweened Animation(补间动画)和Frame Animation(逐帧动画)
它们的思维导图如下所示。
第一大类View Animation视图动画
Tweened Animation(补间动画)
开发者给定两个关键帧数据()让系统在两帧之间实现动画的渐变效果。
例如我们想实现一个动画透明渐变的效果,我们用0表示完全透明,1表示
完全不透明
那么在0~1(可以从0.1,0.2,0.3.....计算)这段数值就交由系统去计算拉。最终形成一个透明的渐变效果。
涉及到的类和接口介绍
AnimationSet:用来存储一组动画组合,它的构造函数如下所示
第一个构造方法,一般很少用。
现在主要讲第二个构造方法,实例化此方法需要传入一个布尔值,如果传入true那么就回告诉系统在播放动画的过程中,
使用系统已经定义的好Interpolator来定义动画的播放速率。如果传入false则表示使用自己自定义的Interpolator。Api文档如下所示。
Interpolator:插入值,这是一个接口,其实现子类用来描述动画播放的速率。(关于自定义Interpolator的用法,我有空的时候会补上的^_^)
它的实现子类如下所示(此数据参考自互联网)
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
RotateAnimation:(旋转动画)这是一个控制对象(试图)在x,y平面内旋转的动画。
共有四个构造方法。
其参数说明
fromDegrees:旋转偏移的开始角度toDegrees:旋转偏移的结束角度pivotXType:指定X轴的旋转模式,可以取值Animation.ABSOLUTE(直接以屏幕为像素单位),Animation.RELATIVE_TO_SELF(以自身为参照物),Animation.RELATIVE_TO_PARENT(相对于父容器)。pivotXValue:指定旋转中心距离父容器左顶点的X距离pivotYType:指定Y轴的旋转模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。pivotYValue:指定旋转中心距离父容器上顶点的Y距离
AlphaAnimation:(透明动画)
共有两个构造方法
其参数说明
fromAlpha:开始的透明度(1表示完成不透明,0表示完全透明)
toAlpha: 结束的透明度
ScaleAnimation:(缩放动画)
共有四个构造方法。
其参数说明
fromX:
动画起始时 X坐标上的伸缩尺寸
toX:
动画结束时 X坐标上的伸缩尺寸
fromY:
动画起始时Y坐标上的伸缩尺寸
toY:
动画结束时Y坐标上的伸缩尺寸
pivotXType:
指定X轴的伸缩模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
pivotXValue:
动画相对于物件的X坐标的开始位置
pivotYType:
指定Y轴的伸缩模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
pivotYValue:
动画相对于物件的Y坐标的开始位置
![](https://img-blog.csdn.net/20151003171428193?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
TranslateAnimation:(平移动画)
共有三个构造方法。除了第一个之外,这个动画类的另外两个参数稍微有点区别。
第二个方法其参数说明
fromXDelta:
动画起始时 X坐标上的移动位置
toXDelta: 动画结束时 X坐标上的移动位置
fromYDelta: 动画起始时Y坐标上的移动位置
toYDelta:
动画结束时Y坐标上的移动位置
第三个方法其参数说明
fromXYype:
指定X轴的平移模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
fromXValue:X平移起始值
toXType:
指定X轴的
平移
模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
toXValue:X平移结束值
fromYType:
指定Y轴的
平移
模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
fromTValue:Y平移起始值
toYType:
指定Y轴的
平移
模式,可以取值Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_PARENT。
toYValue:Y平移结束值
![](https://img-blog.csdn.net/20151003171616080?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
旋转动画
AnimationUtils:(动画工具类)主要用来加载动画的资源文件,值得注意的是,这个
类里面的所有方法都是静态方法,因此在使用的时候不必new了,直接就是AnimationUtils.方法名,
就OK了。
它的所有方法如下
接下来使用编码的方式演示动画
使用步骤
第一步,获取动画集合对象即AnimationSet(必须)
第二步,设置动画的变化速率(不必须)
第三步,设置动画类型,可以旋转,透明,缩放等(必须)
第四步,将动画类型添加到第一步AnimationSet的集合中
第五步,开始执行动画,View.startAnimation(AnimationSet)
透明动画,AlphaAnimation(1,0)
//AnimationSet设置为true表示使用系统自带的方法来计算变化速率
AnimationSet animationSet = new AnimationSet(true);
//表示动画,开始和结束的时候慢速,中间段加速
Interpolator interpolator = new AccelerateDecelerateInterpolator();
//设置动画Interpolator(变化的快慢)
animationSet.setInterpolator(interpolator);
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
//设置动画变化的持续时间
alphaAnimation.setDuration(5000);
animationSet.addAnimation(alphaAnimation);
imageView.startAnimation(animationSet);
动画效果如下所示
AnimationSet animationSet1 = new AnimationSet(true);
//表示动画,先慢速后加速变化
Interpolator interpolator1 = new AccelerateInterpolator();
animationSet1.setInterpolator(interpolator1);
RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F);
//设置动画变化的持续时间
rotateAnimation.setDuration(5000);
animationSet1.addAnimation(rotateAnimation);
imageView.startAnimation(animationSet1);
动画效果如下所示
缩放动画
AnimationSet animationSet2 = new AnimationSet(true);
//表示动画,变化速度按正弦曲线改变,数值5表示,动画按循环播放5次
Interpolator interpolator2 = new CycleInterpolator(5);
animationSet2.setInterpolator(interpolator2);
ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1f, 0, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5F);
//设置动画变化的持续时间
scaleAnimation.setDuration(5000);
animationSet2.addAnimation(scaleAnimation);
imageView.startAnimation(animationSet2);
动画效果如下所示
平移动画
//AnimationSet设置为true表示使用系统自带的方法来计算变化速率
AnimationSet animationSet3 = new AnimationSet(true);
//表示动画,开始的时候加速,后面减速
Interpolator interpolator3 = new DecelerateInterpolator();
animationSet3.setInterpolator(interpolator3);
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0F, Animation.RELATIVE_TO_SELF, 0F, Animation.RELATIVE_TO_SELF, 3F, Animation.RELATIVE_TO_SELF, 0f);
//设置动画变化的持续时间
translateAnimation.setDuration(5000);
animationSet3.addAnimation(translateAnimation);
imageView.startAnimation(animationSet3);
动画效果如下所示
透明,旋转,缩放,平移四个动画综合运用
AnimationSet animationSet4 = new AnimationSet(true);
//动画,回弹变化
Interpolator interpolator4 = new BounceInterpolator();
animationSet4.setInterpolator(interpolator4);
//透明动画
alphaAnimation = new AlphaAnimation(1, 0);
//旋转动画
rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F);
//缩放动画
scaleAnimation = new ScaleAnimation(0, 1f, 0, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5F);
//平移动画
translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0F, Animation.RELATIVE_TO_SELF, 0F, Animation.RELATIVE_TO_SELF, 3F, Animation.RELATIVE_TO_SELF, 0f);
animationSet4.addAnimation(alphaAnimation);
animationSet4.addAnimation(rotateAnimation);
animationSet4.addAnimation(scaleAnimation);
animationSet4.addAnimation(translateAnimation);
//设置动画变化的持续时间
animationSet4.setDuration(5000);
imageView.startAnimation(animationSet4);
动画效果如下所示
以下再用xml资源文件的形式演示动画
第一步,记得在res目录文件下(如果你没有这个文件夹的话),创建一个以anim命名的文件夹,如图所示
![](https://img-blog.csdn.net/20151003172538999?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第二步,创建动画资源文件,并将其命名为scale_animation.xml,各项属性的含义已经介绍过,我就不讲了 (*^-^*)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="5000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5" />
</set>
第三步,使用AnimationUtils加载动画,也就两行代码的事。简单、快捷。
//加载xml动画文件
Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale_animation);
//开始动画
imageView.startAnimation(animation);
动画效果如下所示
完整代码请戳这里Android动画Demo
至此,整个Tweened Animation的基本用法和各项参数说明已经基本讲完,由于篇幅的关系,剩下的Frame Animation和Property Animation我将放在下一
遍博客再总结,如果您还有兴趣请期待我的下一篇博客
Android动画学习总结---中