文档章节

Android基础夯实--重温动画(二)之Frame Animation

Ryane
 Ryane
发布于 2017/03/22 15:27
字数 1522
阅读 162
收藏 3

心灵鸡汤:天下事有难易乎,为之,则难者亦易矣;不为,则易者亦难矣。

如果大家想看更多关于Android基础夯实系列博文,请移步到我的博客: Ryane's Blog

摘要

当你已经掌握了Tween Animation之后,再来看Frame Animation,你就会顿悟,喔,原来Frame Animation简单多了,那么恭喜你,你已经在Animation这条路上走得越来越远了,当你花十来分钟认真看完这篇文章,你就已经走完了动画这条小路的2/3。

概述

我们都知道,在Android系统中,官方给我们提供了两种类型的动画:属性动画(Property Animation)视图动画(View Animation),而视图动画又包含了两种类型:补间动画(Tween animation) 和 帧动画(Frame animation)。

Android基础夯实--重温动画(一)之Tween Animation我们已经对Tween Animation进行了详细讲解,这一片,我会给大家介绍视图动画的另一种 Frame Animation。

在开发中,除了常用的Tween Animation以外,我们还会用到Frame Animation,就是我们所说的帧动画,之所以要实现帧动画是因为它可以实现类似电影的动态效果,因为我们平时所拍的视频也是通过一张张照片插入每一帧,串联起来,从而实现连续播放的视觉效果,而这Tween Animation是无法实现,只能通过Frame Animation来实现。例如我们常见的App动态引导页,很多都是通过Frame Animation来实现的。

引导页

总体来说,Frame Animation实现起来也是比较简单,本文也是主要做一个抛砖引玉,只做基本介绍,更多进阶知识需要大家日后摸索,更权威解释可以看官方文档:Frame Animation。以下先通过Demo给大家更直观地展示Frame Animation。

本文主要对View Animation的Frame Animation做介绍,如果大家有兴趣,可以继续阅读本动画系列其他相关文章,作者也在不断更新完善相关内容,希望大家可以指出有误之处。

Android基础夯实--重温动画(一)之Tween Animation

Android基础夯实--重温动画(三)之初识Property Animation

Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解

Demo

这个Demo主要是使用Frame Animation来实现ImageView播放gif图效果。

效果图

效果图

代码实现

  1. 首先在res/drawable/目录下,增添一个frame.xml文件,里面主要写每一帧播放哪一张照片。最外层标签必须是animation-list,子标签item对应每一帧,每一个item里面的drawable属性对应图片位置、duration对应一帧的时长。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item
        android:drawable="@drawable/g1"
        android:duration="200" />
    <item
        android:drawable="@drawable/g2"
        android:duration="200" />
    <item
        android:drawable="@drawable/g3"
        android:duration="200" />
    <item
        android:drawable="@drawable/g4"
        android:duration="200" />
    <item
        android:drawable="@drawable/g5"
        android:duration="200" />
    <item
        android:drawable="@drawable/g6"
        android:duration="200" />
</animation-list>

  1. 在Activity中,实现如下代码:
//将控件背景设置为我们的AnimationDrawable资源文件
image.setBackgroundResource(R.drawable.frame);
mBinding.play.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //拿到要编译成AnimationDrawable的背景
        AnimationDrawable imageAnimation = (AnimationDrawable)image.getBackground();
        //开始动画
        imageAnimation.start();
    }
});

Frame Animation

在Android的官方文档中,Google对Frame Animation的讲解只是用了比较小的篇幅,可能是因为过于简单,当然,大家通过我上面所说的例子也可以看得出Frame Animation的使用也是非常的简单,下面主要介绍Frame Animation的要点。

文件位置

在资源文件夹下:res/drawable/filename.xml

编译

在上面的例子我们可以了解到,在Activity中,我们是通过image.getBackground()获取到的对象转为了AnimationDrawable,这是因为在我们的xml文件被编译器编译之后就变成了 AnimationDrawable类。

语法

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>

标签

** < animation-list > ** :外层必须要的标签,里面包含一个以上的<item>标签

  • 属性:
    1. android:oneshot:true则只运行一次,false则重复动画。

** < item > ** :每一帧的动画,必须是<animation-list>的子标签。

  • 属性:
    1. android:drawable:对应资源文件。
    2. android:duration:每一帧时长。

AnimationDrawable

AnimationDrawable就是对应于我们自身定义的xml文件,在Java代码中将xml对象转为了AnimationDrawable之后,我们就可以通过它来获取xml文件里面的属性。

父类

AnimationDrawable继承于Object -> Drawable -> DrawableContainer。

接口

实现了Runnable, Animatable接口。

XML文件中的变量

  • android:drawable: 用于该帧的图片。
  • android:duration: 每一帧的时长。
  • android:oneshot: true则只运行一次,false则重复动画。
  • android:variablePadding: 如果true,允许drawable文件的当前状态改变。
  • android:visible: 是否可见。

方法

  • void addFrame (Drawable frame, int duration): 添加一帧动画到动画里面。
  • int getDuration (int i): 获取第i帧的时长。
  • Drawable getFrame (int index): 获取第i帧的Drawbale。
  • int getNumberOfFrames (): 获取共有多少帧。
  • void inflate (Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme): 从XML资源里面加载一个Drawable文件。
  • boolean isOneShot (): 判断是否单次播放。
  • boolean isRunning (): 判断动画是否还在运行。
  • Drawable mutate (): 一个drawable如果使用了mutate()方法,那么对这个drawable属性(包括设置drawable的透明度)修改将不会共享。
  • void setOneShot (boolean oneShot): 设置动画播放一次或者循环。
  • boolean setVisible (boolean visible, boolean restart): 设置该AnimationDrawable是否可见。
  • void start (): 播放。
  • void stop (): 停止。
  • void unscheduleSelf (Runnable what): 让动画重新回到-1帧。

总结

Frame Animation总体来说比较简单,通过XML的划分帧,在Java代码中获取到编译的AnimationDrawable,然后进行播放,难点不多,却是很多引导页的常用实现方法。

© 著作权归作者所有

Ryane
粉丝 42
博文 22
码字总数 55318
作品 0
程序员
私信 提问
android---动画入门(一)

android 动画分为两类,View Animation(视图动画)和property Animation(属性动画),View Animation(视图动画)包含了Tween Animation和Frame Animation, property Animation包含Value Animation......

俠客~
02/21
0
0
android动画简介

android中动画分为2种: Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画; Frame Animation:顺序播放事先做好的图像,是一种画面转换...

长平狐
2013/12/25
171
0
Android animation 学习

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画...

所属暮雪
2014/05/26
442
0
Android Animation学习笔记 (zhuan)

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画...

迷途d书童
2012/03/26
88
0
Android Animation学习笔记

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画...

xiahuawuyu
2012/11/21
184
0

没有更多内容

加载失败,请刷新页面

加载更多

Golang net/http中Cookie的操作

net/http Cookie的使用方法: package mainimport ("strings""fmt""io""net/http")//cookie设置方法一func Cookie(w http.ResponseWriter,r *http.Request){ck:=&http.Cooki......

听夜深窗外风
12分钟前
1
0
Eclipse 远程调试

远程服务端配置 添加远程服务的JVM启动参数 -Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=n 连接到远程ip:6666提供的调试服务。 -Xdebug通知JVM工作在DEBUG模式下...

liangxiao
17分钟前
2
0
JVM类加载机制

Java的程序要运行需要将编译好的class文件加载到JVM运行时数据区。 在了解类的加载机制之前,我们需要了解一下类的生命周期。Java类从被加载到JVM内存开始,到卸载出内存为止,它的整个生命周...

CodingDiary
17分钟前
1
0
android 使用asynctask结合fragment更新UI(另附线程池管理示例)

https://blog.csdn.net/qq_16064871/article/details/70767949

shzwork
17分钟前
2
0
数据库物理设计要做什么

选择合适的数据管理系统。 注意: 1、事务多时选Oracle。 2、SQLserver只支持在Windows下运行。 3、开发用的语言用的.net时,使用SQL server。 2、MySQL常用存储引擎 MySQL是开源数据库,只要...

sunnycat-薛定谔的猫
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部