Android 帧动画使用

摘要:
本文介绍使用AnimationDrawable类来实现动画效果。oneshot="false",表示让动画一直循环播放下去。.backgroundasAnimationDrawableani.start()当动画正在播放时,调用start()方法是不会影响当前播放的。˃android:oneshot="true",动画播放1次后就会自行停止并保持在最后一帧。!//启动valani:AnimationDrawable=frameIv.drawableasAnimationDrawableani.start()//停止valani:AnimationDrawable=frameIv.drawableasAnimationDrawableani.stop()可以看到,2个例子中都需要操作AnimationDrawable。如果想立即播放动画而无需互动,那么可能需要从Activity中的onStart()方法进行调用,该方法会在Android在屏幕上呈现视图时调用。

帧动画

使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。
播放起来,有点像在看gif图。

本文介绍使用AnimationDrawable类来实现动画效果。
为了开发方便,我们可以在xml中指定动画各个帧的信息。

使用背景图片

这是第一个例子。我们先准备4张图片(图片请自备)放进res/drawable/中。
在这个目录里,再新建一个文件ani_frame_1.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android: 
    android:oneshot="false">
    <item
        android:drawable="@drawable/f_zan_1"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_4"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_3"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_2"
        android:duration="250" />
</animation-list>

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

在layout中准备一个ImageView,用它来显示动画

<ImageView
    android: 
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="60dp" />

在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()的话,会从头开始播放。

Android 帧动画使用第1张

使用src

前面我们利用的是ImageView的背景资源。我们也可以使用src
准备另一个动画资源ani_frame_2

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android: 
    android:oneshot="true">
    <item
        android:drawable="@drawable/f_zan_1"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_4"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_3"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_2"
        android:duration="250" />
</animation-list>

android:oneshot="true",动画播放1次后就会自行停止并保持在最后一帧。

! 注意,停止后并不是回到第一帧。

然后在layout中,把它设置为ImageView的src

<ImageView
    android: 
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="60dp"
    android:src="http://t.zoukankan.com/@drawable/ani_frame_2" />

在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 帧动画使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇面试了一个 31岁的iOS开发者,思绪万千,30岁以上的程序员还有哪些出路?(二)Jenkins配置主从节点实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF左右移动动画实现

//boxItem要移动的控件               DoubleAnimation doubleAnimation = newDoubleAnimation(); doubleAnimation.Duration = newDuration (...

MMKV 多进程K-V组件 SP [MD]

博文地址 我的GitHub 我的博客 我的微信 我的邮箱 baiqiantao baiqiantao bqt20094 baiqiantao@sina.com MMKV MMKV Android 安装教程 Android 使用教程 Android 进阶教程 Android 性能对比 MMKV 原理 MMKV for Android 多进程设...

Android上GDB的使用

转自:blog.163.com/bjtornado@yeah/blog/static/69510484201081181657449/ 1) 编译包含Debug 信息设置如下环境变量:TARGET_BUILD_TYPE=debugTARGET_STRIP_MODULE=false (发现即使设置编译为Debug模式, 最后生成的文件系统中的程序和库还是会被...

Android应用提升性能和用户体验

出色的用户体验有三个特征:速度快、响应及时以及无缝。下面的信息帮助你的应用如何能够在Android上实现这些特征。 一、速度快 你不能假设手机与桌面系统和服务器一样提速,更多的是你要关注你的代码是否高效。 编写高效的Android代码,应遵循两个原则: 不要做不必要的事 不要分配不必要的内存 以下是一些达到此目标的小技巧(有一些技巧是与oo的原则冲突,斟...

Shader笔记——6.Shader动画

Shader动画 在Unity Shader中引入时间变量_Time,_SinTime,_CosTime,unity_DeltaTime等内置变量来获取在Shader中获取运行时间,就可以来实现各种动画效果 纹理动画 我们可以使用纹理动画来代替复杂的粒子系统等来模拟各种动画效果。 序列帧动画Image Sequence Animation 最常见的纹理动画...

Android平台下的JNI开发

JNI是Java Native Interface的缩写,通过JNI可以方便我们在Android平台上进行C/C++编程。要用JNI首先必须安装Android的NDK,配置好NDK环境之后就可以在Eclipse下进行C/C++开发了。 其实JNI的原理很容易理解,其本质就是在Java层定义一个接口,同时在C层用C/C++代码实现该接口的功能并编译成动态链接...