这里主要记录一下Tween动画的原理及使用方法
一、原理
关于android Tween动画的原理可参考这两篇博客:
android动画模块 Tween 动画的实现原理: http://www.android100.net/html/201304/23/2262.html
Android动画原理: http://blog.youkuaiyun.com/yelbosh/article/details/7750500
二、xml中使用Tween动画及属性介绍
2.1 Alpha
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="4000"
android:fromAlpha="0"
android:toAlpha="1.0" />
<!-- fromAlpha:动画开始时的透明度(取值范围为0.0到1.0)-->
<!-- toAlpha:动画结束时的透明度(取值范围为0.0到1.0)-->
<!-- 0.0表示完全透明,1.0表示完全不透明,Float值-->
2.2 Scale
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="4000"
android:fromXScale="0"
android:fromYScale="0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="0"
android:repeatCount="1"
android:repeatMode="reverse"
android:toXScale="1.0"
android:toYScale="1.0" />
<!--
fromXDelta,fromYDelta 起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
toXDelta, toYDelta 动画结束时X,Y的座标
interpolator 指定动画插入器 常见的有
加速减速插入器 accelerate_decelerate_interpolator
加速插入器 accelerate_interpolator,
减速插入器 decelerate_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 为重新执行,方向不变 -->
2.3 Translate
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="4000"
android:fromXDelta="0"
android:toXDelta="500"
android:fromYDelta="0"
android:toYDelta="500"/>
<!--
fromXDelta,fromYDelta 起始时X,Y座标
toXDelta, toYDelta 动画结束时X,Y的座标 -->
2.4 Rotate
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="4000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
<!--
fromDegrees 动画开始时的角度
toDegrees 动画结束时物件的旋转角度,正代表顺时针
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置 -->
在xml中定义好各种效果后,我们需要在代码中引用一下上面的效果,只需要简单的两行代码就行了:
Animation animation= AnimationUtils.loadAnimation(this,R.anim.animation_rotate);
你的View.startAnimation(animation);
tips:
xml文件位于 res/anim 文件下
单个的效果往往过于单调,我们也可以在xml中用<set>标签将上面的动画效果组合起来:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<alpha
android:duration="4000"
android:fromAlpha="0"
android:toAlpha="1.0" />
<rotate
android:duration="4000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
</set>
其中set的属性有:
- android:duration 动画持续时间,以毫秒为单位
- android:fillAfter 如果设置为 true,控件动画结束时,将保持动画最后时的状态
- android:fillBefore 如果设置为 true,控件动画结束时,还原到开始动画前的状态
- android:fillEnabled 与 android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
- android:repeatCount 重复次数
- android:repeatMode 重复类型,有 reverse 和 restart 两个值,reverse 表示倒序回放,restart 表示重新放一遍,必须与 repeatCount 一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
- android:interpolator 设定插值器,其实就是指定的动作效果,比如弹跳效果等,后面会单独列出一单讲解。
三、interpolator插值器
首先来看下官网给出的interpolator的定义:interpolaotor定义了动画变化的速率,它允许基础动画(alpha, scale, translate, rotate)加速,减速,重复变化等等。在补间动画中,我们一般只定义关键帧(首帧和尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等。下面是几种常见的插值器:
Interpolator对象 | 资源ID | 功能作用 |
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 先加速再减速 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 加速 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 先回退一小步然后加速前进 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 先回退一小步然后加速前进,超出终点一小步后再回到终点 |
BounceInterpolator | @android:anim/bounce_interpolator | 最后阶段弹球效果 |
CycleInterpolator | @android:anim/cycle_interpolator | 周期运动 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 减速 |
LinearInterpolator | @android:anim/linear_interpolator | 匀速 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 快速到达终点并超出一小步最后回到终点 |
怎么用它呢?它的用法也非常简单只需要在xml文件中加一句话就行了
android:interpolator="@android:anim/bounce_interpolator"
如果只简单地引用这些插值器还不能满足需要的话,我们要考虑一下个性化插值器。我们可以创建一个插值器资源修改插值器的属性,比如修改AnticipateInterpolator的加速速率,调整CycleInterpolator的循环次数等。为了完成这种需求,我们需要创建XML资源文件,然后将其放于/res/anim下,然后再动画元素中引用即可。我们先来看一下几种常见的插值器可调整的属性:
<accelerateDecelerateInterpolator> 无
<accelerateInterpolator> android:factor 浮点值,加速速率,默认为1
<anticipateInterploator> android:tension 浮点值,起始点后退的张力、拉力数,默认为2
<anticipateOvershootInterpolator> android:tension 同上 android:extraTension 浮点值,拉力的倍数,默认为1.5(2 * 1.5)
<bounceInterpolator> 无
<cycleInterplolator> android:cycles 整数值,循环的个数,默认为1
<decelerateInterpolator> android:factor 浮点值,减速的速率,默认为1
<linearInterpolator> 无
<overshootInterpolator> 浮点值,超出终点后的张力、拉力,默认为2
如果需要自定义插值器的话,只需要在res/anim 下创建xml资源文件,修改对应的属性,引用即可。
源码: http://download.youkuaiyun.com/detail/u010838555/9874789