Android动画学习(一):帧动画和补间动画

前言

在Android开发中会经常使用到动画,本次对Android中的动画做一个简单总结备忘。

Android中的动画主要分为三类:帧动画,补间动画和属性动画,本片内容会对帧动画和补间动画进行简单说明总结。

系列文章:
Android动画学习(一):帧动画和补间动画
Android动画学习(二):基本属性动画
Android动画学习(三):自定义属性动画

一、帧动画

帧动画是将一张张单独的图片以连续的方式播放而形成的视觉动画。实现这种动画主要依靠UI图片资源。

帧动画的实现一般是依靠xml文件来实现,利用xml来实现不仅可以方便的定义资源文件,还能够有利于动画的复用。

示例代码如下,我们首先定义一个名为test_frame_anim2.xml的帧动画:

<animation-list
    android:oneshot="false"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/arrow_right"
        android:duration="1000" />
    <item
        android:drawable="@drawable/icon_warning"
        android:duration="1000" />
    <item
        android:drawable="@drawable/icon_left_arrow"
        android:duration="1000" />
</animation-list>

当我们调用时可以通过设置ImageView控件的图片resource实现动画的设置,示例代码如下:

    /**
     * 逐帧动画
     */
    private fun setFrameAnimation() {
        imageAnimFrame1?.setImageResource(R.drawable.test_frame_anim2)
        val animationDrawable1 = imageAnimFrame1?.drawable as AnimationDrawable?
        animationDrawable1?.start()
    }

二、补间动画

1. 基本内容

常用的补间动画主要包括四种基本内容:

  1. alpha(透明度)
  2. scale(缩放)
  3. translation(平移)
  4. rotation(旋转)

补间动画可以采用上述四种中的一种或多种效果进行组合。

2. 实现

补间动画的实现主要包括有两种实现方式:XML实现和代码实现。

1. xml实现

补间动画的xml文件一般放置在res/anim/文件夹下面,我们在此文件夹下面新定义一个xml动画:test_flash_anim1.xml,代码如下(效果随便写的,可以看下xml参数):

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:duration="1000"
        android:fromAlpha="0.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:toAlpha="1.0" />
    <scale
        android:duration="1000"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />
    <translate
        android:duration="3000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="50%"
        android:toYDelta="50%" />

    <rotate
        android:duration="2000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="180" />
</set>

然后调用如下代码即可以调用xml动画:

    private fun setFlashXMLAnim(view: View?) {
        val animation: Animation =
            AnimationUtils.loadAnimation(DemoApplication.mContext, R.anim.test_flash_anim1)
        view?.startAnimation(animation)
    }

对xml中部分属性做下简单说明:

1. alpha

标签 说明
duration 时长,单位ms
fromAlpha 起始透明度,范围0-1
toAlpha 结束透明度,范围0-1
interpolator 动画插值器,控制动画的速度

2. scale

标签 说明
fromXScale 起始X比例大小,当值为1.0时表示原大小
fromYScale 起始Y比例大小,当值为1.0时表示原大小
toXScale 结束X比例大小,当值为1.0时表示原大小
toYScale 结束Y比例大小,当值为1.0时表示原大小
pivotX 缩放起点X轴坐标,三种取值:数值,百分比,百分数P。起始点都是以左上角为标准。数值单位为px;百分比为当前view的百分比大小;百分数p为父控件宽度的百分比大小。
pivotY 缩放起始点Y轴坐标,取值同pivotX。
duration 动画时长,单位ms。

3. translate

标签 说明
fromXDelta 起始X轴位置
fromYDelta 起始Y轴位置
toXDelta 结束X轴位置
toYDelta 结束Y轴位置
duration 动画时长,单位ms

translate的位置标签的取值支持三种取值方式:数值,百分数,百分数P,和scale标签相似。

  1. 数值单位为px.
  2. 百分比表示为自身View大小的百分比
  3. 百分数P表示为父View大小的百分比

4. rotate

标签 说明
fromDegrees 起始角度,单位度。
toDegrees 结束角度,单位度。
pivotX 旋转中心的X轴位置,同样有数值,百分比,百分数P三种取值
pivotY 旋转中心Y轴位置,取值同pivotX。
duration 动画时长,单位ms。
fillAfter 动画执行完后是否保持最后状态,取true保持

5. set

set标签是可以将多个动画组合。

2. 代码实现

代码实现补间动画主要是依靠类Animation。这个类具有多个子类:AlphaAnimationScaleAnimationTranslateAnimationRotateAnimation。我们可以创建这几个子类对象实现对应的补间动画,以透明度动画为例,代码如下:

    private fun setFlashAlphaAnim(view: View?) {
        var animation: AlphaAnimation = AlphaAnimation(0f, 1.0f)
        animation.duration = 1000
        view?.startAnimation(animation)
    }

除此之外,补间动画还有一些其他常见的方法:

方法 说明
fillAfter 设置在动画执行结束后的状态,设置为false则返回动画初始状态,设置为true保持动画执行结束之后的状态
repeatMode 动画重复模式,常见的有REVERSE和RESTART两种。REVERSE表示反向执行动画,RESTART表示重新执行动画。
repeatCount 动画重复次数

备注

在Android Studio编辑时能够看到当前的项目工程有着两个动画文件夹:animanimator,这两个动画文件夹是有所区别的:

  1. anim文件夹一般用来存放补间动画或者帧动画。
  2. animator文件夹下一般用来存放属性动画。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,015评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,373评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,253评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,069评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,079评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,550评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,911评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,892评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,435评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,465评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,586评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,178评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,920评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,356评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,493评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,151评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,663评论 2 366

推荐阅读更多精彩内容