Android入门教程 | 动画之帧动画

Android应用的动画

  • 帧动画
  • 补间动画
  • 属性动画
帧动画(Frame Animation)
用多张图片来组成动画。一帧帧的播放图片,利用人眼视觉残留原理,给我们带来动画的感觉。它的原理的 GIF 图片、电影播放原理一样。
我们可以使用 AnimationDrawable 来实现动画效果。
使用 AnimationDrawable 使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。 播放起来,有点像在看 gif 图。
下面使用 AnimationDrawable 类来实现动画效果。 为了开发方便,我们可以在 xml 中指定动画各个帧的信息。
使用背景图片
这是第一个例子。我们先准备 4 张图片(图片请自备)放进 res/drawable/ 中。 在这个目录里,再新建一个文件 ani_frame_1.xml

可以看到根节点 包含了 4 个 item。每个子节点都定义了一个帧。 duration 是这一帧的时常(毫秒)。drawable 是指定可绘制资源。oneshot="false",表示让动画一直循环播放下去。 这样动画资源就准备好了。
在 layout 中准备一个 ImageView,用它来显示动画

在 activity 中操作这个 ImageView 。把动画资源设置为背景。
var mFrameIv: ImageView? = null // override fun onCreate(savedInstanceState: Bundle?) mFrameIv = findViewById(R.id.iv1) mFrameIv!!.setBackgroundResource(R.drawable.ani_frame_1)

把 ImageView 的背景强转为 AnimationDrawable 。播放动画,要用AnimationDrawable.start() 方法。
val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable ani.start()

当动画正在播放时,调用 start() 方法是不会影响当前播放的。
停止动画,AnimationDrawable.stop()
val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable ani.stop()

stop() 方法可以让动画停止在当前帧。再调用 start() 的话,会从头开始播放。
使用src
前面我们利用的是 ImageView 的背景资源。我们也可以使用 src。 准备另一个动画资源 ani_frame_2

android:oneshot="true",动画播放 1 次后就会自行停止并保持在最后一帧。
! 注意,停止后并不是回到第一帧。
然后在 layout 中,把它设置为 ImageView 的 src

在 activity 中就不是操作 ImageView 的 background 了,而是操作 drawable
// 启动 val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable ani.start()// 停止 val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable ani.stop()

可以看到,2 个例子中都需要操作 AnimationDrawable 。 请务必注意,对 AnimationDrawable.start() 方法不能在 Activity 的 onCreate() 方法期间调用,因为 AnimationDrawable 尚未完全附加到窗口。如果想立即播放动画而无需互动,那么可能需要从 Activity 中的 onStart() 方法进行调用,该方法会在 Android 在屏幕上呈现视图时调用。
AnimationDrawable 类有几个属性可以注意一下
属性 说明
isOneShot 是否只播放1次,与xml中的android:oneshot对应
isRunning 当前动画是否正在播放
numberOfFrames 帧的数量
Android 动画相关面试题 1, 插值器的种类有哪些?怎么自定义插值器?
【Android入门教程 | 动画之帧动画】插值器决定值的变化模式,默认的种类有九个。
默认种类有:
  • AccelerateDecelerateInterpolator :在动画开始与结束的地方速率改变比较慢,在中间的时候加速
  • AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始速率变化加快
  • LinearInterpolator:以常量速率改变
  • AnticipateInterpolator:开始的时候向后然后向前甩
  • CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
  • PathInterpolator:动画执行的效果按贝塞尔曲线
  • anticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
  • OvershootInterpolator:向前甩一定值后再回到原来位置
  • BounceInterpolator:动画结束的时候有弹起效果
自定义插值器:
  • 写一个类实现 Interpolator 接口,Interpolator 是一个空的接口继承了 TimeInterpolator 接口,定义getInterpolation 方法即可
2,属性动画出现的版本和原因(或者关于属性动画的其他问题)?
出现的版本:Android 3.0(API 11)后才提供的一种全新动画模式,出现原因为作用对象局限于 View,没有改变 View 的属性,只是改变视觉效果,动画效果单一。
二类三方:
  • 二类:ValueAnimator、ObjectAnimator是其重要的两个类。
  • 三方:ValueAnimator有ofInt、ofFloat、ofObject三个重要的方法
三个方法的作用:
  1. 创建动画实例
  2. 将传入的多个参数进行平滑过渡:此处传入 0 和 1,表示将值从 0 平滑过渡到 1 ,如果传入了 3 个 Int 参数 a,b,c ,则是先从 a 平滑过渡到 b,再从 b 平滑过渡到 c,以此类推,他们内置了估值器
插值器和估值器:
  • 插值器(Interpolator):决定值的变化模式
  • 估值器(TypeEvaluator):决定值的具体变化数值
3,动画能组合在一起使用么?
可以将动画组合在一起使用AnimatorSet,AnimatorSet.play() 播放当前动画的同时可以
  • .with() :将现有动画和传入的动画同时执行
  • .after() :将现有动画插入到传入的动画之后执行
  • .before() : 将现有动画插入到传入的动画之前执行
4,ObjectAnimator需要操作的view的属性(Property)有
  • Alpha 控制View的透明度
  • float TranslationX 控制X方向的位移
  • float TranslationY 控制Y方向的位移
  • float ScaleX 控制X方向的缩放倍数
  • float ScaleY 控制Y方向的缩放倍数
  • float Rotation 控制以屏幕方向为轴的旋转度数
  • float RotationX 控制以X轴为轴的旋转度数
  • float RotationY 控制以Y轴为轴的旋转度数
5, 补间动画都有哪些(Tween动画有哪些|怎么旋转、平移、缩放、透明度)?
补间动画由Animation类来实现具体效果,包括
  • 平移(TranslateAnimation)、
  • 缩放(ScaleAnimation)、
  • 旋转(RotateAnimation)、
  • 透明度(AlphaAnimation)
四个子类,四种变化。
Android 零基础入门教程视频参考

    推荐阅读