Tween Animation(补间动画)能够做一些简单的动画效果,比如平移、旋转、缩放、透明度、以及四种动画效果的组合。Android 关于Tween Animation在android.view.animation中。
补间动画有两种实现方式:
可以通过两种方式进行创建补间动画,但是使用xml更简单些,谷歌官方也推荐使用这个方式,我们会把xml配置文件放到**/res/anim**
我们先来了解一些标签:
:创建动画的根目录
:平移动画
:缩放动画
:翻滚动画
: 透明度动画
比如,我们创建一个translate.xml,表示一个平移动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true"
android:fillAfter="true"
android:duration="3000"
android:repeatMode="reverse"
android:interpolator="@android:anim/cycle_interpolator">
<!--属性
shareInterpolator:表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值 器,那么子动画就需要单独制定所需的插值器或者使用默认值
duration:动画持续时间
fillAfater:动画结束以后View是否停留在结束位置,true表示View停留在结束位置,false 则不停留
android:repeatMode 动画重复的Mode
-->
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="500"
android:toYDelta="500"
/>
<!-- 平移动画
android:fromXDelta-表示x的起始值
android:toXDelta-表示x的结束值
android:fromYDelta-表示y的起始值
android:toYDelta-表示y的结束值
-->
</set>
当需要组合动画的时候uni_animation.xml,我们可以这样写:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true"
android:duration="300"
android:fillAfter="true"
android:repeatCount="infinite"
android:repeatMode="reverse"
>
<!--属性
shareInterpolator:表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独制定所需的插值器或者使用默认值
duration:动画持续时间
fillAfater:动画结束以后View是否停留在结束位置,true表示View停留在结束位置,false则不停留
android:repeatMode 动画重复的Mode
repeatCount:重复动画次数 当值为infinite时无限循坏
-->
<alpha
android:fromAlpha="0.1"
android:toAlpha="1"></alpha>
<!--透明度动画
fromAlpha表示透明度起始值,
toAlpha表示透明度结束值-->
<scale
android:fromXScale="0.5"
android:fromYScale="0.5"
android:pivotX="20"
android:pivotY="20"
android:toXScale="1.2"
android:toYScale="1"
></scale>
<!--缩放动画
android:fromXScale-水平方向缩放的起始值
android:toXScale-水平方向缩放结束值
android:fromYScale-竖直方向缩放的起始值
android:toScale-竖直方向缩放结束值
android:pivotX 缩放轴点的x坐标
android:pivotY缩放轴点的y坐标-->
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100"></translate>
<!-- 平移动画
android:fromXDelta-表示x的起始值
android:toXDelta-表示x的结束值
android:fromYDelta-表示y的起始值
android:toYDelta-表示y的结束值
-->
<rotate
android:fromDegrees="0"
android:pivotX="10"
android:pivotY="10"
android:toDegrees="180"></rotate>
<!--旋转动画
android:fromXDelta-旋转开始的角度
android:toDegrees="180"-旋转结束的角度
pivotX 缩放轴点的x坐标
pivotY缩放轴点的y坐标
默认情况下轴点是View的中心点-->
</set>
配置好xml文件后,我们可以通过AnimationUtils 加载xml文件生成特定的Animation.
lateinit var mUniAnimation: Animation
mUniAnimation = AnimationUtils.loadAnimation(this, R.anim.uni_animation)
view.startAnimation(mUniAnimation)
配置文件创建补间动画,是简单里面最常用的方式,代码也简单。
Android Library为补间动画提供了一些API:
以AnimationSet为列子,我们创建一个平移、缩放、透明度、翻转的动画。
lateinit var mUniAnimation: AnimationSet
//各类动画
lateinit var mTranslateAnimation: Animation
lateinit var mScaleAnimation: Animation
lateinit var mAlphaAnimation: Animation
lateinit var mRotateAnimation: Animation
//创建需要添加到AnimationSet的动画
mTranslateAnimation = TranslateAnimation(0f,500f,0f,500f)
mScaleAnimation = ScaleAnimation(0.5f,5f,0.5f,5f)
mAlphaAnimation = AlphaAnimation(0.1f,1f)
mRotateAnimation = RotateAnimation(0f,180f)
mUniAnimation = AnimationSet(true)
//动画间隔
mUniAnimation.duration=3000
//插值d
mUniAnimation.interpolator=AccelerateInterpolator()
//重复模式
mUniAnimation.repeatMode=Animation.REVERSE
//重复次数
mUniAnimation.repeatCount=5
//添加组合动画
mUniAnimation.addAnimation(mTranslateAnimation)
mUniAnimation.addAnimation(mScaleAnimation)
mUniAnimation.addAnimation(mRotateAnimation)
mUniAnimation.addAnimation(mAlphaAnimation)
创建后动画后,启动动画类似xml的方式:
iv_image.startAnimation(mUniAnimation)
动画API提供了AnimationListener监听动画的状态:
mTranslateAnimation.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(animation: Animation?) {
// 当动画重复的时候触发
Log.d("test","onAnimationRepeat")
}
override fun onAnimationStart(animation: Animation?) {
// 当动画开始的时候触发
Log.d("test","onAnimationStart")
}
override fun onAnimationEnd(animation: Animation?) {
// 当动画结束的时候触发
Log.d("test","onAnimationEnd")
}
})
动画框架有两个repeatMode:
如果我们想要设置无限动画,可以这样做:
mTranslateAnimation.repeatCount=Animation.INFINITE
mTranslateAnimation.repeatMode=Animation.REVERSE
名称 | 标签 | 子类 | 效果 |
---|---|---|---|
平移动画 | translate | TranslateAnimation | 移动View |
缩放动画 | scale | ScaleAnimation | 放大和缩小View |
旋转动画 | rotate | RotateAnimation | 旋转View |
透明度渐变动画 | alpha | AlphaAnimation | 改变View透明度 |
在定义动画的时候,一般我们只定义首帧和尾帧,然后由系统生成中间的帧数,生成中间帧的过程我们称为"插值",插值器就是定义动画变化速录过程。
下面是常见的插值器:
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 | 快速到达终点并超出一小步最后回到终点 |
以下为参考资料: