美文网首页
Android 动画总结(2) - 帧动画

Android 动画总结(2) - 帧动画

作者: 三流之路 | 来源:发表于2018-04-01 18:19 被阅读0次

Android 动画总结(1) - 概述
Android 动画总结(3) - 补间动画
Android 动画总结(4) - 插值器
Android 动画总结(5) - 属性动画
Android 动画总结(6) - 估值器
Android 动画总结(7) - ViewGroup 子元素间的动画
Android 动画总结(8) - Activity 转场动画
Android 动画总结(9) - 过渡动画


Frame Animation,也叫 Drawable Animation,原理就类似视频快速播放一帧一帧的图片。一般场景下很少使用,工作中遇到的是有时会有背景色,用若干颜色值变化,有时一个 View 要弹跳,其实是做好了若干切图,图片大小一致,但里面的内容处于不同位置,然后播放起来看着好像是在弹跳。

如果真的有用大图,需要防止 OOM 问题。

xml 方式

res/anim 目录创建动画 xml 文件。其中一个 <item> 代表一帧。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >
    <item
        android:drawable="@color/color1"
        android:duration="200" />
    <item
        android:drawable="@color/color2"
        android:duration="200" />
    <item
        android:drawable="@color/color3"
        android:duration="200" />
    <item
        android:drawable="@color/color4"
        android:duration="200" />
    <item
        android:drawable="@color/color5"
        android:duration="200" />
    <item
        android:drawable="@color/color6"
        android:duration="200" />
    <item
        android:drawable="@color/color7"
        android:duration="200" />
    <item
        android:drawable="@color/color8"
        android:duration="200" />
    <item
        android:drawable="@color/color9"
        android:duration="200" />
    <item
        android:drawable="@color/color10"
        android:duration="200" />
    <item
        android:drawable="@color/color11"
        android:duration="200" />
    <item
        android:drawable="@color/color12"
        android:duration="200" />
</animation-list>

如果是颜色值,要在 colors.xml 中定义好,直接在 android:drawable 处使用 #FFFFFF 这种十六进制颜色值会报错

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="color1">#FF3030</color>
    <color name="color2">#FF4500</color>
    <color name="color3">#FF6EB4</color>
    <color name="color4">#FF7F50</color>
    <color name="color5">#FF8C00</color>
    <color name="color6">#FFA54F</color>
    <color name="color7">#FFB90F</color>
    <color name="color8">#FFC1C1</color>
    <color name="color9">#FFDEAD</color>
    <color name="color10">#FFE4E1</color>
    <color name="color11">#FFEFD5</color>
    <color name="color12">#FFF68F</color>
</resources>

其中 android:oneshot 用于控制动画是否循环播放,为 true 只播放一次并停留在最后一帧,默认是 false,循环播放的。

然后代码控制播放,实际运行发现既可以作为 Background 也可以作为 Resource,都可以启动动画。

// 作为 Background
image.backgroundResource = R.drawable.test // 设置背景资源
// or
// image.backgroundDrawable = resources.getDrawable(R.drawable.frame_drawable_test)
// getBackground() 取得 AnimationDrawable 对象
val animDrawable : AnimationDrawable = image.background as AnimationDrawable
// 启动动画
animDrawable.start()

// 作为 Resource
image.imageResource = R.drawable.frame_drawable_test
// getDrawable() 取得 AnimationDrawable 对象
val animDrawable2 : AnimationDrawable = image.drawable as AnimationDrawable
animDrawable.stop() // 停止动画
animDrawable2.start()       

代码方式

val animDrawable = AnimationDrawable()
animDrawable.isOneShot = true
(1..12).map {
    val id = resources.getIdentifier("color" + it, "color", packageName)
    animDrawable.addFrame(resources.getDrawable(id), 200) // 添加一帧,播放时长 200 ms
}
// 作为 Resource
image.setImageDrawable(animDrawable)
// 作为 Background
// image.backgroundDrawable = animDrawable
// image.background = animDrawable
animDrawable.start()

效果如下:

帧动画

相关文章

网友评论

      本文标题:Android 动画总结(2) - 帧动画

      本文链接:https://www.haomeiwen.com/subject/tqjacftx.html