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

摘要

当你已经掌握了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 > ** :外层必须要的标签,里面包含一个以上的标签

  • 属性:

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

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

  • 属性:

    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,然后进行播放,难点不多,却是很多引导页的常用实现方法。

Android基础夯实--重温动画(二)之Frame Animation的更多相关文章

  1. Android基础夯实--重温动画(五)之属性动画 ObjectAnimator详解

    只有一种真正的英雄主义 一.摘要 ObjectAnimator是ValueAnimator的子类,它和ValueAnimator一样,同样具有计算属性值的功能,但对比ValueAnimator,它会更 ...

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

    宝剑锋从磨砺出,梅花香自苦寒来:千淘万漉虽辛苦,吹尽狂沙始到金: 长风破浪会有时,直挂云帆济沧海 一.摘要 Animator类作为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,但是我们不 ...

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

    每个人都有一定的理想,这种理想决定着他的努力和判断的方向.就在这个意义上,我从来不把安逸和快乐看作生活目的的本身--这种伦理基础,我叫它猪栏的理想.--爱因斯坦 一.摘要 Property Anima ...

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

    心灵鸡汤:真正成功的人生,不在于成就的大小,而在于你是否努力地去实现自我,喊出自己的声音,走出属于自己的道路. 摘要 不积跬步,无以至千里:不积小流,无以成江海.学习任何东西我们都离不开扎实的基础知识 ...

  5. Android动画效果之Frame Animation(逐帧动画)

    前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...

  6. android 动画基础绘——view 动画(二)[补]

    前言 这个是对view 动画的补充,是一些view 动画的特殊使用场景. 回顾第一篇关于view 动画的,我介绍到view的动画都是针对元素本身的. 当我们开发view动画的时候,我们看到几个元素在做 ...

  7. Android基础夯实--你了解Handler有多少?

    概述 对于刚入门的同学来说,往往都会对Handler比较迷茫,到底Handler是个什么样的东西.当然,可能对于一些有工作经验的工程师来说,他们也不一定能很准确地描述,我们来看下API的介绍. Han ...

  8. Android学习笔记_39_tween动画的实现(Animation和Frame)

    一.Animation动画的实现及特点: 1.Tween动画,通过对 View 的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.   动画效果的定义可以采用XML来做也 ...

  9. Android 基础UI组件(二)

    1.Spinner 提供一个快速的方法来从一组值中选择一个值.在默认状态Spinner显示当前选择的值.触摸Spinner与所有其他可用值显示一个下拉菜单,可以选择一个新的值. /** * 写死内容: ...

随机推荐

  1. Linux时间子系统之二:表示时间的单位和结构【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/7979295 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  2. 织梦DEDEcms首页调用文档整篇内容

    DedeCMS在首页调用内容页中的整篇文章 织梦程序是一个很强大的程序,也有很多朋友使用织梦程序来做博客,想要像是在博客中一样能在首页中调用一整篇文章,其实在织梦程序中页可以很完美的实现这个功能. 在 ...

  3. 逻辑运算符,if、swtch语句(java基础知识三)

    1.逻辑运算符的基本用法 * A:逻辑运算符有哪些 &(逻辑与) |(逻辑或) !(逻辑非) ^(逻辑异或) &&(短路与) ||(短路或) * 注意事项: * a:逻辑运算符 ...

  4. c语言中为什么左移不分符号数无符号数,而右移分呢??

    因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移.右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!( ...

  5. 后台while收发过程

    fuse_loop_mt.c 中fuse_do_work函数使用while循环在后台不断运行,每一个while循环中,主要有两个操作. 1. fuse_session_receive_buf(mt-& ...

  6. asp.net微软图表控件MsChart

    前段时间,开发项目时,由于需要,需要将一些数据统计,并以图表形式显示.由于是asp.net,所以就找到了MsChart图表控件,还是挺方便实用的,分享一下. MsChart控件的主要组成如图所示 工具 ...

  7. [Selenium] close alert window

    public static boolean isAlertPresent(WebDriver driver) { try { driver.switchTo().alert(); return tru ...

  8. 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径

    Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...

  9. 【BZOJ 3224】 普通平衡树

    [题目链接] 点击打开链接 [算法] 本题是Splay模板题,值得一做! [代码] #include<bits/stdc++.h> using namespace std; #define ...

  10. Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题

    安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined 出现这种错误是因为主机名和/etc/host ...