Android 动画之 ---- View Animation (视图动画,补间动画)
来源:互联网 发布:淘宝直播小二 编辑:程序博客网 时间:2024/05/14 20:46
View Animation通过在两个关键帧之间补充渐变的动画效果来实现,其优点是可以节省空间。Android目前支持:
alpha:渐变透明度动画效果 AlphaAnimation(透明度)
scale: 渐变缩放动画效果 ScaleAnimation(缩放)
translate: 渐变位置移动动画效果 TranslateAnimation(位移)
rotate: 渐变旋转动画效果 RotateAnimation(旋转)
组合动画:在一起完成酷炫的动画效果。 AnimationSet(组合)
实现动画的方式有两种:
1.代码创建
2.xml布局
可以看出来Animation抽象类是所有补间动画类的基类,所以基类会提供一些通用的动画属性方法,如下我们就来详细看看这些属性:
android:fillAfter 这个属性设置的是在这个动画结束后是否保留这个动画的最后一帧的效果填充后面的动画,true表示停留在最后一帧,false表示不停留在最后一帧
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "300" android:pivotX= "50%" android:pivotY= "50%" android:fillAfter= "true" android:duration= "1000"> </rotate>
上面的xml属性动画的配置中,我们将fillAfter的值设置为true,可以看到它停留在了最后一帧。
android:fillBefore 它表示View动画结束时是否会停留在动画开始的状态
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "300" android:pivotX= "50%" android:pivotY= "50%" android:fillEnabled= "true" android:fillBefore= "true" android:duration= "1000"> </rotate>
可以看到图片旋转300度后又回到了最开始的状态。
android:repeatMode 重复类型,取值为reverse|restart,reverse:表示倒序回放,restart:表示重新放一遍,这个属性必须与repeatCount联合使用,因为它的前提是重复,即重复播放时的播放类型。
也就是说,无论我们补间动画的哪一种都已经具备了这种属性,也都可以设置使用这些属性中的一个或多个。
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "360" android:pivotX= "50%" android:pivotY= "50%" android:repeatMode= "restart" android:repeatCount= "2" android:fillEnabled= "true" android:fillBefore= "true" android:duration= "1000"> </rotate>
reverse:表示倒序回放,restart:表示重新放一遍
android:repeatMode=”restart” android:repeatMode=”reverse”
在上述xml文件配置中我们将repeatCount设置为2,从运行效果可以看出两者的区别restart是连续播放,而reverse播放一遍后倒序播放了一遍。
android:repeatCount 动画重复的次数(注意是重复的次数),可以是你想循环播放的次数数值,也是可以取值infinite:表示无限循环,这个属性在上面也介绍用到了,就不再上图片了。
那接下来我们就看看每种补间动画特有的一些属性说明吧.
2-2-2 Alpha属性详解
其实它的意义很好理解,一个View透明度变化,肯定是从一个透明度变为另一个透明度。这样就需要两个属性fromAlpha和toAlpha,这个变化的过程是android自动帮我们实现的,也就是说假如从完全透明,到完全不透明这中间的过程是谷歌工程师为我们提供好的,当然我们也可以改变。
2-2-2-1 Alpha xml实现
<?xml version="1.0" encoding= "utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha= "0.0" android:toAlpha= "1.0" android:repeatCount= "2" android:duration= "3000" android:fillAfter= "true" > </alpha>
在上面的xml配置中我们设置了图片的透明度从0逐渐变化到1,可以看到运行效果从完全不透明变化到完全透明。
2-2-2-2 Alpha代码实现
针对alpha动画所特有的属性,将设置的数据传递到AlphaAnimation的构造方法中即可,AlphaAnimation所有的构造函数如下图所示:
可以看到它一共有两个构造函数,第一个构造函数我们一般不会用到,这里主要来看第二个构造函数,可以看到它接收两个float类型的值,一个是fromAlpha另外一个是toAlpha。也就是在上面xml文件中配置的,所以要想完成上述xml文件中的效果,这里的fromAlpha和toAlpha需要传的值分别是0和1,表示透明度从完全透明变化到完全不透明。对于公共的属性的设置,直接调用公共的方法进行设置就ok了。所以经过上述分析我们可以想到,上述xml文件的代码实现是下面这样的
AlphaAnimation alphaAnimation=new AlphaAnimation(0,1);alphaAnimation.setDuration(3000);alphaAnimation.setRepeatCount(2);alphaAnimation.setFillAfter(true);ivImage.setAnimation(alphaAnimation);
运行效果:
2-2-3 Rotate属性详解
fromeDegress和toDegress这两个属性很好理解fromDegress表示从动画开始时旋转的角度,而toDegress当然就表示动画结束时旋转的角度了,如果你还不能理解透彻,相信下面的两个小例子可以帮助你,首先来看看运行效果。
2-2-3-1 Rotate xml实现
它的xml配置文件如下:
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "360" android:duration= "1000"> </rotate>
最后XML文件是编写好了,那么我们如何在代码中把文件加载进来并将动画启动呢?这是就要借助AnimationUtils这个类了,只需调用如下代码即可:
Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate); ivGirl.startAnimation(animation);
从运行效果我们可以看到它从起始的0度旋转了360度。另外我们还能得出一个结论:
默认的旋转的起始点是View的左上角顶点为起始点。需要注意的是这里开始旋转角度fromDegree与结束时的旋转角度toDegrees都是是相对于起始位置而言的.
什么意思呢?看下面这个例子你就会彻底理解。我们修改下xml配置文件,修改如下:
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "60" android:toDegrees= "90" android:fillAfter= "true" android:duration= "10000"> </rotate>
运行效果图:
在上述xml中我们设置的fromDegress是60度,toDegress是90度,从运行效果中可以看出点击运行按钮后,View首先立即旋转了60度作为旋转动画的起始位置,之后又旋转了30度到了90度,所以大家一定要理解清楚这里的toDegress是相对于起始位置而言的。
“pivotX”表示旋转点X轴坐标,也就是我们的View是以哪个点为基准而旋转的,它的值可以是数值、百分数、百分数p 三种样式,比如50、50%、50%p,
当为50时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标;
当为50%时, 表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;
当为50%p时,表示在当前的左上角加上父控件宽度的50%做为旋转点X坐标。
“pivotY”属性与”pivotX”属性一样。接下来就分别结合实例来详细理解下这三种取值吧。
取值为数值
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "360" android:pivotX= "75" android:pivotY= "125" android:duration= "10000"> </rotate>
从上面的解释可以知道,这里的旋转的X点的坐标是在原点的基础之上增加75px,而Y点的坐标是在原点的基础之上增加125px。由于图片的高度和宽度分别为150、250,运行在这是480*320的模拟器此时1dp=1px)所以我们设置的pivotX=75,pivotY=125也就刚好在图片的正中间,运行效果如下
注意在这张美女图片的下巴上有个小白点,这个小白点是图片的中心位置。我们发现它的旋转点就是这个View的中心点。
取值为百分数
取值为百分数后加p表示旋转点在原点的基础之上加上父控件的百分值。如pivotX取值为50%p就表示旋转点的x坐标在原点基础之上父控件宽度的50%。经计android:pivotX=”23%p”,android:pivotY=”26%p”时旋转的点处于View的中间,480*26/100约等于125,即旋转点的Y坐标在坐标原点的基础之上加上125与(1)类似
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "360" android:pivotX= "23%p" android:pivotY= "26%p" android:duration= "10000"> </rotate>
运行效果与上面一样,就不再上图了。
取值为百分数后面加p
<?xml version="1.0" encoding= "utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees= "0" android:toDegrees= "360" android:pivotX= "23%p" android:pivotY= "26%p" android:duration= "10000"> </rotate>
运行效果与上面一样,就不再上图了。
2-2-3-1 Rotate 代码实现
看看它的构造函数
可以看到第二个构造函数中需要两个参数fromDegrees、toDegrees这个构造函数默认的旋转的起点是View的左上角的那个点。
第三个构造函数在第二个的基础之上增加了pivotX和pivotY,用来调整View围绕旋转的那个点。它默认的pivotType是Animation.ABSOLUTE及相当于xml中取值为数值。
第四个构造函数就比较全面了,增加了每个值得pivotType与上面ScaleAnimaion中pivotType是一致的。
RotateAnimation rotateAnimation=new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);rotateAnimation.setDuration(3000);ivImage.startAnimation(rotateAnimation);
2-2-4 Scale属性详解
android:fromXScale起始的X方向上相对自身的缩放比例,类型float,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍
android:toXScale:结尾的X方向上相对自身的缩放比例,类型float
android:fromYScale:起始的Y方向上相对自身的缩放比例,类型float
android:toYScale:结尾的Y方向上相对自身的缩放比例,类型float
android:pivotX: 缩放起点X轴坐标,可以是数值、百分数、百分数p ,具体意义roate中已经演示
android:pivotY:缩放起点Y轴坐标,取值及意义与pivotX一样
2-2-4-1 Scale xml实现
<?xml version="1.0" encoding= "utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:fromXScale= "2.0" android:toXScale= "1.0" android:fromYScale= "2.0" android:toYScale= "1.0" android:pivotX= "50%" android:pivotY= "50%" android:duration= "5000"> </scale>
可以清楚的看到这张图片先是放大了两倍然后逐渐恢复原状。
2-2-4-2 Scale 代码实现
来看看它的构造函数
看到它一共有四个构造函数,同样我们只看它的第二、三、四个构造函数,从构造函数中我们可以清楚的看到它构造函数中所需传的参数基本与xml文件中的配置一致,其中
ScaleAnimation scaleAnimation=new ScaleAnimation(fromX, toX, fromY, toY, pivotXType, pivotXValue, pivotYType, pivotYValue);
可能大家看到这个构造函数中的两个参数有点陌生:pivotXType和pivotXValue(这里以X为例)。我们知道xml文件中pivotX的取值可以为数值、百分数、百分数p,如50,50%,50%p。当为数值时,表示在当前View的左上角,即原点处加上50px,做为旋转点X坐标;如果是50%表示在当前控件的左上角加上自己宽度的50%做为旋转点X坐标;如果是50%p,那么就是表示在当前控件的左上角加上父控件宽度的50%做为旋转点X坐标。
这里的pivotXType就是用来指定我们采取的是哪种数值的。它有三种值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT
代码如下:
ScaleAnimation scaleAnimation=new ScaleAnimation(2.0f, 1.0f, 2.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);scaleAnimation.setDuration(5000);ivImage.startAnimation(scaleAnimation);
2-2-5 Translate属性详解
2-2-5-1 Translate xml实现
<?xml version="1.0" encoding= "utf-8"?> <translate xmlns:android ="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="200" android:toYDelta="300" android:duration="5000"> </translate>
运行效果:
2-2-5-1 Translate 代码实现
首先来看看它的构造函数
可以看到它有三个构造函数,其中第三个构造函数中fromXType、fromXValue中的fromXType的取值与上面ScaleAnimaion中的pivotXType的取值是一样的,具体可以看看上面那个表格。
第二个构造函数需要传递fromXDelta、toXDelta、fromYDelta、toYDelta,当采用这个构造函数时默认的是使用Animation.ABSOLUTE,对应xml中的取值为数值。
代码实现如下:
TranslateAnimation translateAnimation=new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 200, Animation.ABSOLUTE, 300);translateAnimation.setDuration(5000);ivImage.setAnimation(translateAnimation);
2-2-6 AnimationSet详解
AnimationSet继承自Animation,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation,所以特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。
接着们就来看一个组合动画吧
2-2-6-1 AnimationSet xml 实现
<?xml version="1.0" encoding= "utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true"> <alpha android:fromAlpha= "0.0" android:toAlpha= "1.0" android:duration= "3000" /> <scale android:fromXScale= "0.0" android:toXScale= "1.0" android:fromYScale= "0.0" android:toYScale= "1.0" android:pivotX= "50%" android:pivotY= "50%" android:duration= "3000" /> <rotate android:fromDegrees= "0" android:toDegrees= "720" android:pivotX= "50%" android:pivotY= "50%" android:duration= "3000"/> <translate android:startOffset= "3000" android:fromXDelta= "0" android:fromYDelta= "0" android:toXDelta= "85" android:toYDelta= "0" android:duration= "1000" /> <alpha android:startOffset= "4000" android:fromAlpha= "1.0" android:toAlpha= "0.0" android:duration= "1000" /> </set>
我们用它来实现一个稍微酷炫点的动画
2-2-6-2 AnimationSet 代码 实现
首先来看看它的构造函数
一般我们都是用到第一个构造函数,可以看到它的第一个参数是boolean shareInterpolator从名字也能看出来它的作用是标识是否将AnimationSet中的插值器运用到集合中的所有动画,为true表示AnimationSet集合中的所有动画都用AnimationSet中设置的插值器,false表示AnimatonSet集合中的动画想用哪个动画,需要自己设置。
代码实现如下
ScaleAnimation scaleAnimation=new ScaleAnimation(0f, 1f, 0f, 1f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);scaleAnimation.setDuration(3000);RotateAnimation rotateAnimation=new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);rotateAnimation.setDuration(3000);TranslateAnimation translateAnimation=new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 85, Animation.ABSOLUTE, 0, Animation.ABSOLUTE, 0);translateAnimation.setDuration(1000);translateAnimation.setStartOffset(3000);AlphaAnimation alphaAnimation=new AlphaAnimation(1f,0f);alphaAnimation.setDuration(1000);alphaAnimation.setStartOffset(4000);AnimationSet animationSet=new AnimationSet(false);animationSet.addAnimation(scaleAnimation);animationSet.addAnimation(rotateAnimation);animationSet.addAnimation(translateAnimation);animationSet.addAnimation(alphaAnimation);ivImage.startAnimation(animationSet);
上面就是一个标准的使用我们定义的补间动画的模板。至于补间动画的使用,Animation还有如下一些比较实用的方法介绍:
既然补间动画只能给View使用,那就来看看View中和动画相关的几个常用方法吧,如下:
到此整个Android的补间动画常用详细属性及方法全部介绍完毕,如有特殊的属性需求可以访问Android Developer查阅即可。如下我们就来个综合大演练。
2-4 视图动画注意事项
补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个 Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没 有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。
2-5 视图动画Interpolator插值器详解
2-5-1 插值器简介
首先来看下官网给出的interpolator的定义:interpolaotor定义了动画变化的速率,它允许基础动画(alpha, scale, translate, rotate)加速,减速,重复变化等等。在补间动画中,我们一般只定义关键帧(首帧和尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等,我们先来看一幅图,如下:
可以看见其实各种插值器都是实现了Interpolator接口而已,同时可以看见系统提供了许多已经实现OK的插值器,具体如下:
如上就是系统提供的一些插值器,下面我们来看看怎么使用他们。
2-5-2 插值器使用方法
它的用法也非常简单只需要在xml文件中加一句话就行了
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/bounce_interpolator" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="200" android:toYDelta="300" android:duration="5000"> </translate>
如果只简单地引用这些插值器还不能满足需要的话,我们要考虑一下个性化插值器。我们可以创建一个插值器资源修改插值器的属性,比如修改AnticipateInterpolator的加速速率,调整
CycleInterpolator的循环次数等。为了完成这种需求,我们需要创建XML资源文件,然后将其放于/res/anim下,然后再动画元素中引用即可。我们先来看一下几种常见的插值器可调整的属性:
接下来就来看几个不是特别好理解的插值器的运行效果,没有演示到的,大家可以自己动手运行看看效果
anticipateInterploator
先回退一小步然后加速前进
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/anticipate_interpolator" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:fillAfter="true" android:toYDelta="480" android:duration="3000"> </translate>
运行效果:
可以看到它先回退一段距离然后再加速前进。
在上面我们也提到有几种插值器是支持对属性的调整的,我们就以anticipateInterploator为例,这时我们需要新建一个xml文件放置于/res/anim文件夹下,比如我们新建一个my_anticipate_interpolator.xml文件,它的内容如下:
<?xml version="1.0" encoding="utf-8"?> <anticipateInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:tension="4.0"/>
可以看到这里将tension的值改为了4,引用它的方法也非常简单如下:
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/my_anticipate_interpolator" ......> </translate>
运行效果:
可以明显的看出小球回退的距离要远一点。当然你也可以更改其他插值器的其它属性,从而符合自己的要求。
AnticipateOvershootInterpolator
可以看到AnticipateOvershootInterpolator的运行效果先回退一小步然后加速前进,超出终点一小步后再回到终点。
BounceInterpolator
可以看到在小球在最后阶段的效果是弹球效果。
OvershootInterpolator
通过以上介绍大家对视图动画的xml文件配置应该有一个比较详细的理解了吧
本文主要参考网络资源:
http://blog.csdn.net/dmk877/article/details/51980734
http://blog.csdn.net/dmk877/article/details/51912104
http://www.cnblogs.com/ldq2016/
- Android 动画之 ---- View Animation (视图动画,补间动画)
- Android动画之View animation(视图动画)
- android动画之帧动画(drawable animation)和补间动画(view animation)
- Android Animation 之 View Animation(补间动画)
- Animation动画之View Animation(补间动画)
- View Animation补间动画
- Android动画(View Animation之Tween Animation(补间动画))
- Android-Animation动画之Tween Animation补间动画
- Android视图动画---View Animation
- Android视图动画(View Animation)
- Android-View Animation(视图动画)
- Android动画之View Animation(视图动画)
- Android Animation之补间动画
- Android补间动画(View Animation,Tweened Animation)
- Android三种动画View Animation(补间动画) 、Drawable Animation(帧动画) 、Property Animation(属性动画)(上)
- Android三种动画View Animation(补间动画) 、Drawable Animation(帧动画) 、Property Animation(属性动画)(下)
- Android 动画--补间动画(Tween Animation)
- Android动画之补间动画(Tween Animation)
- modelsim-win64-10.4-se 下载、安装、破解全攻略
- dorado做下拉框双列,选择单列
- Linux 查看文件或文件夹大小
- git上传和下载githubs上的项目
- Hibernate学习---检索优化
- Android 动画之 ---- View Animation (视图动画,补间动画)
- 微信神兽大厅12牛牛源码搭建
- 把dao放到私服上,然后service从私服上下载
- 关于java反射的个人理解
- CentOS 6.8 安装mysql5.7
- Oracle数据库的常用操作总结
- Boost笔记-boost使用方式
- Javascript模块化编程(三):require.js的用法
- CMU与FAIR联合发布非局部神经网络,有效提升视频分类、对象分割、姿态估计结果