欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 动画-View Animation

程序员文章站 2022-03-16 21:37:29
...

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 属性小结

名称 标签 子类 效果
平移动画 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 快速到达终点并超出一小步最后回到终点

以下为参考资料:

Android动画之View Animation