美文网首页CodeAndroid知识Android开发
Android中的动画(XML方式)实践(逐帧动画与补间动画)

Android中的动画(XML方式)实践(逐帧动画与补间动画)

作者: 海水未顶 | 来源:发表于2017-06-02 19:14 被阅读470次

Android提供了三种类型动画:一开始的传统动画(包含两种类型:逐帧动画补间动画(View动画))和Android3.0 之后出现的

属性动画

逐帧动画:基于单元格的动画,每一帧显示一个不同的drawable。一帧一帧的顺序播放。

补间动画:补间动画应用于view,通过对其位置,大小,旋转和透明度的改变,让view动起来。

属性动画:属性动画几乎可以让应用程序中任何对象动起来。所有补间动画的内容,都可以通过属性动画实现。

下面逐一介绍:

注:这篇文章偏重于以xml方式实现相应动画效果。

逐帧动画

逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧一帧的播放图片,类似卡通动画。

目标:

实现如下图效果:

loading

步骤:

1.在res/drawable目录下新建loading_frame.xml文件:

loading_frame.xml

根节点是animation-list,内部由一到多个<item>节点组成,

oneshot属性表示是否只播放一次(true:一次;false:循环播放).

item节点声明是一个动画帧,其中 android:drawable属性定义要显示的图像,android:druation代表此帧持续的时间,毫秒为单位。

注:在AndroidStudio中强制规定带animation-list节点xml文件必须放在res/drawable文件下(eclipse(ADT)貌似支持任意放res/drawable和res/anim)在androidStudio中若放在res/anim下会报错:

错误提示:1 错误提示:2

2.新建页面布局activity_frame.xml:如上图布局很简单 上面一个imageview,下面两个button,都水平居中(相对于parent)。

   设置imageView背景为loading_frame: android:background="@drawable/loading_frame"  这里就不贴代码了。

3.新建FrameActivity

frameActivity主要逻辑代码

当然为了避免animationDrawable带来的内存泄露,建议在onDestroy方法中做如下操作:

onDestroy()

注意:

帧数比较多的动画不建议用逐帧动画实现,其一会显得卡顿,其二容易引起OOM

补间动画

补间动画(Tween Animation):支持通过对View的内容进行一系列的图形变换来实现动画效果。使用补间动画进行改变透明度、缩放、旋转、平移等操作比通过手动重绘Canvas达到相似效果要消耗更少的资源,在实现上也更加简便。

补间动画类型对应

补间动画使用XML语言来定义时,其XML文件被放在项目的res/anim/目录下。

由于相关的属性有点多,在这先把它们公用的属性做一下说明,然后再对每个分类下的特定属性在做对应动画效果时,进行描述。

属性对应方法及描述

在上面图表中可以看到第二行有一个interpolator属性,表示动画所采用的插值器。插值器影响动画的播放速度。可以不指定,默认为加速减速插值器(@android:anim/accelerate_decelerate_interpolator")。

常用9种插值器

当然安卓也支持自定义插值器,具体网上有许多相关博客教程,可自行搜索,这里先不作介绍。

说了这么多,都好像背书的赶脚了。下面我们来玩玩吧

渐变

1.在res/anim/目录下新建view_alpha.xml

view_alpha.xml

(从头播放重复一次)

这里有两个属性是alpha独有的:

android:fromAlpha-动画开始时操作对象的alpha值

android:toAlpha-动画终止时操作对象的alpha值

2.在对应view上应用动画

start_alpha

3.看一下运行结果:

渐变—效果图

由于默认android:fillBefore为true,所以动画运行结束时会回到初始状态

缩放

1.在res/anim/目录下新建view_scale.xml

view_scale.xml

(反向播放重复两次,保持最后状态)

属性:

android:fromXScale-动画起始时,X轴坐标的伸缩尺寸。(0.0表示收缩到没有。1.0表示正常没伸缩。>1.0表示放大。<1.0表示收缩。)

android:toXScale-动画结束时X轴坐标的伸缩尺寸

android:fromYScale-动画起始时Y轴坐标的伸缩尺寸

android:toYScale-动画结束时Y轴坐标的伸缩尺寸

android:pivotX-缩放动画作用点在X轴方向上的位置。(android:pivotX=”50”表示绝对定位,相对于零点偏移50   –>Animation.ABSOLUTE  

                                                                                       android:pivotX=”50%”表示相对控件本身    –>Animation.RELATE_TO_SELF

                                                                                         android:pivotX=”50%p”表示相对控件的父控件  –>Animation.RELATE_TO_PARENT)

android:pivotY-缩放动画作用点在Y轴方向上的位置(同上pivotX)

2.应用动画:

start-scale

3.运行结果:

缩放-效果图

旋转

1.在res/anim/目录下新建view_rotate.xml

view_rotate.xml

(运行过程:先向相反的方向改变一点,然后在加速播放至超出结束值一点,然后在缓慢回到结束值)

属性:

android:fromDegrees-动画起始的角度(可正可负)

android:toDegrees-动画终止的角度(可正可负)

android:pivotX-旋转作用点在X轴方向上的位置

android:pivotY-旋转作用点在Y轴方向上的位置

2.应用动画

start-rotate

3.运行结果

旋转-效果图

平移

1.在res/anim/目录下新建view_translate.xml:

view-translate.xml

(运行过程:先向相反的方向改变一点,然后在加速播放至超出结束值一点,然后在缓慢回到结束值)

属性:

android:fromXDelta-平移动画起始位置X轴坐标 (android:fromXDelta=”50”表示绝对定位,相对于零点偏移50   –>Animation.ABSOLUTE

                                                                                android:fromXDelta=”50%”表示相对控件本身 –>Animation.RELATE_TO_SELF

                                                                               android:fromXDelta=”50%p”表示相对控件的父控件–>Animation.RELATE_TO_PARENT)

android:toXDelta-平移动画结束位置X轴坐标

android:fromYDelta-平移动画起始位置Y轴坐标

android:toYDelta-平移动画结束位置Y轴坐标

2.应用

start-translate

3.运行结果

平移-效果图

组合

1.在res/anim/目录下新建view_set.xml:

view_set.xml

属性:

android:shareInterpolator-是否对子动画设置相同的插值器

先来推测一下运行过程:前1.5秒执行渐变,然后图片以自身中心为旋转轴心,从60度转到325度,耗时1.8s。

2.应用

start-set

3.运行效果:

组合-效果图

额。。。跟当初推测的不一致。它一开始就转了60度然后再渐变,再转到325度。也就是说吧<rotate>的初始状态给先执行了,因为默认的fillBefore属性为true。好吧,在<rotate>中设置fillBefore为false,再试一次:

view_set.xml 修改后代码段

再看看运行效果---

组合-效果图-1 没有发生任何变化!!!!

是不是fillBefore失效了???看看源码,进去Animation类中,有一个mFillEabled变量(主要看上面注释):

mFillEnabled

想到有个属性android:fillEnabled 与fillBefore是否被忽略有关,fillEnabled默认值是false(这时fillBefore设置为false失效)。

那将android:fillEnabled设为true试试:

view_set.xml 再次修改后代码段

看看效果:

组合-效果图-终

OK  要的就是这种效果(是不是很有朦胧美,哈哈)。


LayoutAnimation(View动画特殊使用场景

  LayoutAnimation作用于ViewGroup,可控制其子元素的出场效果。经常看到有些listview,它每个item都以动画的形式出现。这里我们也来实现一个类似的功能吧!

1.为子元素指定入场动画(在res/anim下新建anim_layout_item.xml)

anim_layout_item.xml

2.定义layoutAnimtion-res/anim下新建anim_layout.xml

anim_layout.xml

属性:

android:delay - 先从字面意思理解就是延迟,具体什么意思 通过下面实现 再看

android:animationOrder - 动画顺序 有三种选项 :normal,reverse,random  具体各自有什么效果 通过下面实现 再看

android:animation 指定子元素具体动画

3.为listview指定android:layoutAnimation属性:

布局文件-lsitview片段

看看运行结果:

delay-0-效果图

貌似没什么效果。那将anim_layout.xml中修改一下---android:delay="1",

delay-1-效果图

从上面两图可以看到,当delay=0时,各item同时出现在页面中,当delay=1时,各item是依次以设定的动画方式出现,细心一点看,几乎当上一个item到达最左部时(完成入场动画),下一个item开始进入视图播放入场动画。所以delay应该指的是子元素的入场延迟。具体来说,第一个子元素延迟500ms*1(anim_layout_item.xml中设置duration=500,即子元素入场动画周期为500ms)才开始播放入场动画,第2个子元素延迟500ms*1*2播放入场动画,以此类推。我们再来验证一下,将delay设置为0.5,推测应该出现的效果为:上一个item大概到达中间位置时,下一个item开始入场:

delay-0.5-效果图

delay的作用大概搞清楚了,下面来看看animationOrder的三个选项:normal 上面几个图都是设为这个选项的,下面就只用看其他两种选项下的运行效果。

android:animationOrder="reverse" android:animationOrder="random"

从上面几个动图的效果对比可以看到

android:animationOrder属性是用来表示子元素动画的顺序的。默认即为normal:顺序显示,排在前面item先开始入场;reverse:倒序;random:随机。

当然view动画还可用于实现activity的切换效果等场景(5.0后,geogle推出的新的转场动画,还支持共享元素)。这里就不一一介绍了。

还有属性动画没有介绍,属性动画非常强大,可以通过它实现绚丽的效果。鉴于它的相关内容比较多,一时半会也说不完,下次有空再整理学习吧。

感谢:

https://developer.android.google.cn/guide/topics/graphics/view-animation.html

https://developer.android.google.cn/guide/topics/graphics/drawable-animation.html


相关文章

  • Android中的动画实践之属性动画(一 )

    接着上篇Android中的动画(XML方式)实践(逐帧动画与补间动画)来学习下属性动画。 我们知道属性...

  • Android动画

    Android动画分类: 视图动画:补间动画、逐帧动画 属性动画 视图动画 补间动画 可以在xml中定义动画,然后...

  • Android 动画锦集

    Android 动画可分为逐帧动画、补间动画、属性动画。使用传统的逐帧动画、补间动画可以实现 Android 基本...

  • Android 动画总结

    Android 中的动画可以分为以下几类: 逐帧动画 补间动画 属性动画 一、逐帧动画 逐帧动画的原理就是让一系列...

  • 安卓动画

    Android 中的动画可以分为以下几类: 逐帧动画 补间动画 属性动画 1、逐帧动画 逐帧动画的原理就是让一系列...

  • Android 动画

    Android中动画分为三种: 逐帧动画 补间动画 属性动画 逐帧动画 逐帧动画类似于gif或是电影的原理,通过将...

  • Android 资源简介(五) AnimationDrawabl

    AnimationDrawable 代表动画资源。Android 既支持逐帧动画,也支持补间动画。 定义补间动画的...

  • Android动画三:使用 Transition 最简单方式实现

    在 android.view.animation.*包下有多种实现动画的方式,有逐帧动画、补间动画、属性动画,可以...

  • Android动画

    Android动画 动画类型 视图动画(View Animatio)补间动画(Tween Animation)逐帧...

  • Android动画

    文章脑图 1、Android动画种类 逐帧动画、补间动画、属性动画 逐帧动画 逐帧动画的原理就是让一系列的静态图片...

网友评论

本文标题:Android中的动画(XML方式)实践(逐帧动画与补间动画)

本文链接:https://www.haomeiwen.com/subject/mdosfxtx.html