Android 动画-View Animation

缪远
2023-12-01

Android 动画-View Animation

Tween Animation

Tween Animation(补间动画)能够做一些简单的动画效果,比如平移、旋转、缩放、透明度、以及四种动画效果的组合。Android 关于Tween Animation在android.view.animation中。

补间动画有两种实现方式:

  • 通过XMLl配置文件创建动画
  • 通过JAVA对象创建动画

通过xml配置文件创建动画

可以通过两种方式进行创建补间动画,但是使用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)

配置文件创建补间动画,是简单里面最常用的方式,代码也简单。

通过Java对象创建动画

Android Library为补间动画提供了一些API:

  • TranslateAnimation 平移动画
  • ScaleAnimation 缩放动画
  • AlphaAnimation 透明度渐变动画
  • RotateAnimation 翻转动画
  • AnimationSet 动画集

以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)

Tween Animation 的监听事件

动画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:

  • Animation.RESTART 重复动画时从开始的状态启动动画
  • Animation.REVERSE 重复动画时从结束的状态回滚动画

如果我们想要设置无限动画,可以这样做:

        mTranslateAnimation.repeatCount=Animation.INFINITE
        mTranslateAnimation.repeatMode=Animation.REVERSE

Tween Animation 属性小结

名称标签子类效果
平移动画translateTranslateAnimation移动View
缩放动画scaleScaleAnimation放大和缩小View
旋转动画rotateRotateAnimation旋转View
透明度渐变动画alphaAlphaAnimation改变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快速到达终点并超出一小步最后回到终点

以下为参考资料:

Android动画之View Animation

 类似资料: