Android 中动画分为几个大类。1个是视图动画,一个是帧动画,最后是属性动画。帧动画是将帧设置为view的背景,这个简单,下面我们来看一下视图动画和属性动画的区别。
视图动画与属性动画的区别
Android的视图动画和属性动画在功能和使用上有一些明显的区别。
视图动画主要作用于视图,实现如缩放、旋转等效果。这种动画效果相对固定,只能应用于视图对象,且只能改变视图的大小和位置,而不能真正改变视图的属性。视图动画在Android 3.0以前的版本中广泛应用,但其在应用中的灵活性相对较低。
相比之下,属性动画在Android 3.0之后引入,其功能和灵活性都大大增强。属性动画可以对一个对象的属性进行操作,不仅能应用于视图对象,还能应用于任何对象。它不仅能实现缩放、旋转等效果,还能自定义动画效果,监听动画的过程,并在动画过程中或完成后执行特定的动作。属性动画通过改变对象的属性来实现动画,可以真正改变对象的属性。
总的来说,属性动画比视图动画更强大和灵活。它不仅可以实现视图动画的所有功能,还具有更多的自定义选项和更广泛的应用范围。
那么为什么要知道视图动画
属性动画可以理解为视图动画的升级版本,所以视图动画的很多属性在属性动画里面还是有,所有的视图动画都是继承与animation类,而所有的属性动画的父类都是Animator。回到核心问题上,为什么要知道视图动画,这个还是看业务诉求,视图动画是不更改view的属性的,所以对哪些动画不需要更改属性的就很有用了,如果用属性动画,会重新计算整个布局,那么就得不偿失了。
正文
属性
所有的视图动画都是继承与animation类。所以scale、alpha、translate、rotate都包含animation的基础属性。
- duration 一次动画的耗时,单位为毫秒
- fillAfter 如果设置为true 则表示动画结束后保持动画结束的状态
- fillBefore 如果设置为true,动画结束后,将还原为初始状态。
- repeatCount 动画重复次数,当为infinite 的时候,表达无限循环
- repeatMode 设定重复类型,reverse 倒序,restart 重放。
- interpolator 设定插值器,就是动画的效果,如果不设置就是均衡分布的。
通过AnimationUtils.loadAnimation() 进行加载。所以所有的标签都有对应的类去体现,我们也可以直接通过创建对应的类去实现一些动画效果。
scale 标签
该标签用于缩放动画,可以实现动画调整控件尺寸的效果。对应的类是:ScaleAnimation
-
android:fromXScale 动画起始时,控件在 轴方向上相对自身的缩放比例,浮点值。比如 1.0 代表自身无变化 代表缩小 倍, 2. 代表放大 倍。
-
android toXScale 动画结束时 控件在 轴方向上相对自身的缩放比例,浮点值。
-
android :fromYScale 动画起始时,控件在 轴方向上相对自身 缩放比例,浮点值。
-
android: to YScale 动画结束时-, 件在 轴方向上 对自身 缩放比例 孚点值。
-
android pivotX 缩放起始点 轴坐标,可以是数值、百分数、百分数 种样式,如50 50% 50%p 。如果是数值, 表示在当前视图 左上角 ,即原点处加 50px ,作为缩放起始点 轴坐标 如果是 50 则表示在当前控件的左上角加上自己宽度的50%作为缩放起始点的X的坐标,如果说50%p 则表达在当前控件的左上角加上父控件宽度的50%作为缩放起始点的X轴坐标。
-
android:pivotY: 和pivotX 含义类似。
alpha 标签
用于实现渐变透明度动画效果。对应的类是:AlphaAnimation
- fromAlpha 开始时候的透明度。0到1,0表示全透明,1表示完全不透明。
- toAlpha 表示结束的时候的透明度,值和from 一致。
rotate 标签
用于实现转移旋转动画效果。对应的类是:RotateAnimation
- fromDegrees 开始旋转的角度,正表示顺时针角度,负表示逆时针角度。
- toDegrees 结束时候的角度。
- pivotX pivotY 旋转的中心位置,和scale 的类似。
translate 标签
用于实现画面变换位置移动到动画效果。对应的类:TranslateAnimation
- fromXDelta fromYDelta 起始点的坐标,和pivotX 的值及其含义一致。
- toYDelta toXDelta 终点的位置。和from 取值一致。
set 标签
这个是一个容器。可以将alpha、scale、rotate、translate写到这个里面,用于实现组合动画。对应的类:AnimationSet
动画控制与监听
在业务诉求上,我们可能对动画进行一系列的操作,所以Animation还提供了一系列的函数用于操作动画。
- cancel 取消动画。
- reset 重置动画到开始前的状态。
- setAnimationListener 设置动画的监听,开启(onAnimationStart),结束(onAnimationEnd),重复(onAnimationRepeat)
插值器
用于控制动画的变化速率,如果不设置就是均匀分布。这些问题都是由Interpolator 类决定。Android系统已经提供了一系列的插值器。在xml 中使用对应interpolator 属性。
AccelerateDeceleratelnterpolator
加速减速插值器, 表示在开始与结束的地方速率改变较慢,在中 间的时候加速。
Acceleratelnterpolator
加速插值器,表示在动画开始的地方速率改变比较慢,然后开始加速。
Deceleratelnte polator
Decelerateinterpolator 是减速插值器,表示在动画开始的一瞬间加速到最大值,然后逐渐变慢。
Linearlnterpolator
Linearlnterpolator 是线性插值器, 称匀速加速器 很显然 它的速率是保持恒定的。
Bouncelnterpolator
Bouncelnterpolator 是弹跳插值器,模拟了控件自由落地后回弹的效果。类似于小球落地的效果。
Anticipatelnterpolator
Anticipatelnterpolator 是初始偏移插值器,表示在动画开始的时候向前偏移 段距离,然后应用动画。tension属性表示张力值,默认是2,越大初始的偏移量越大,速度越快。
Overshootlnterpolator
Overshootlnterpolator 是结束偏移插值器,表示在动画结束时,沿动画方向继续运动一段距离后再结束动画。tension属性表示张力值,默认是2,越大初始的偏移量越大,速度越快。
AnticipateOvershootlnterpolator
AnticipateOvershootlnterpolator Anticipatelnterpolator Overshootlnterpolator的结合体。即在动画开始时向前偏离,在动画 束时向后偏移一段距离。
Cyclelnterpolator
Cyclelnterpolator 是循环插值器,表示动画循环播放特定的次数,速度沿正弦曲线改变。cycles 表示动画循环次数。这个优先级高于fillAfter 属性。
帧动画
需要使用animation-list 。对应的class:AnimationDrawable ,他主要用于对于帧进行拉伸,并把他设置为view的背景。
- oneshot 如果说true 表示执行一次,false则是一致循环执行。
- item 表示一帧,duration 表示当前帧执行时间,单位毫秒。
结束
通常而言,动画都是不写到xml中的,而是在需要的地方通过通过对应的功能创建对应的动画。如果一个动画被多个地方使用,那么写到xml 中也很合理,至于为什么全是xml的描述,因为xml定义的属性在对应的class 中都会存在,使用xml更清晰一些。这个玩意属于偏门的知识点,说有用吧,有用,但是不用这个玩意,说没有用吧,有的时候又要用一下。