Android(java)学习笔记198:Android下的帧动画(Drawable Animation)

1.帧动画:

帧动画顾名思义,一帧一帧播放的动画就是帧动画。 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧的切换罢了。

2.Android如何实现播放帧动画如下:

(1)首先我在网上下载了一张gif动态图片,如下:

这是一个gif动态图片,其实它是很多静态图片相同区域快速切换,我们怎么样把这个gif动态图片中的静态图片从中抽离出来?

这里我使用了一个小工具gifsplitter(大家可以百度在网上自行下载)

gifsplitter软件截图如下:

(2)然后我们使用上面提到的gifsplitter工具,抽取出上面gif动态图片中的静态图片,运行效果如下:

其中frameslist.gsf是配置文件,大家可以不用理会

(3)上面(1)和(2)只是准备数据源,下面开始是编写代码,实现播放帧动画(一帧一帧播放的动画):

新建一个Android工程,名称为AnimationDemo,如下:

同时在res文件下,新建一个drawable文件夹,把刚才我们抽取的静态图片(frameslist.gsf配置文件不用复制)复制到drawable文件夹中,如下:

这里程序只能识别命名方式为由小写字母、数字和下划线组成的图片,所以我把之前名称改成如上的样子。

(4)布局文件activity_main.xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity"
    android:gravity="center_horizontal" >

    <ImageView
        android:layout_width="380dp"
        android:layout_height="380dp"
        android:id="@+id/iv" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放动画"
        android:onClick="play"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止播放"
        android:onClick="stop"
        />

</LinearLayout>

(5)上面我们已经引入的图片资源,我们要做的事件就是如何把这些图片关联起来,一帧一帧按照特定的顺序播放形成动画效果,接下来核心关键:

我们在res/drawable文件夹下,定义一个beautiful_img.xml,如下:

<?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/img00" android:duration="50" />
    <item android:drawable="@drawable/img01" android:duration="50" />
    <item android:drawable="@drawable/img02" android:duration="50" />
    <item android:drawable="@drawable/img03" android:duration="50" />
    <item android:drawable="@drawable/img04" android:duration="50" />
    <item android:drawable="@drawable/img05" android:duration="50" />
    <item android:drawable="@drawable/img06" android:duration="50" />
    <item android:drawable="@drawable/img07" android:duration="50" />
    <item android:drawable="@drawable/img08" android:duration="50" />
    <item android:drawable="@drawable/img09" android:duration="50" />
    <item android:drawable="@drawable/img10" android:duration="50" />
    <item android:drawable="@drawable/img11" android:duration="50" />
    <item android:drawable="@drawable/img12" android:duration="50" />
    <item android:drawable="@drawable/img13" android:duration="50" />
    <item android:drawable="@drawable/img14" android:duration="50" />
    <item android:drawable="@drawable/img15" android:duration="50" />
    <item android:drawable="@drawable/img16" android:duration="50" />
    <item android:drawable="@drawable/img17" android:duration="50" />
    <item android:drawable="@drawable/img18" android:duration="50" />
    <item android:drawable="@drawable/img19" android:duration="50" />
    <item android:drawable="@drawable/img20" android:duration="50" />
    <item android:drawable="@drawable/img21" android:duration="50" />
    <item android:drawable="@drawable/img22" android:duration="50" />
    <item android:drawable="@drawable/img23" android:duration="50" />
    <item android:drawable="@drawable/img24" android:duration="50" />
    <item android:drawable="@drawable/img25" android:duration="50" />
    <item android:drawable="@drawable/img26" android:duration="50" />
    <item android:drawable="@drawable/img27" android:duration="50" />
    <item android:drawable="@drawable/img28" android:duration="50" />
    <item android:drawable="@drawable/img29" android:duration="50" />

</animation-list>

animation-list是根节点:

•其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画 ,true表示只播放一遍; 

•根标签下,通过item标签对动画中的每一个图片进行声明  ;

•android:duration 表示展示所用的该图片的时间长度 (单位:ms);

注意:这里的item的顺序就是我们动画播放的顺序

(6)主代码MainActivity.java:

package com.itheima.frameanim;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {

    //动画引用
    AnimationDrawable rocketAnimation;

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      ImageView rocketImage = (ImageView) findViewById(R.id.iv);
      rocketImage.setBackgroundResource(R.drawable.beautiful_img);
      rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
    }

//    public boolean onTouchEvent(MotionEvent event) {
//      if (event.getAction() == MotionEvent.ACTION_DOWN) {
//        rocketAnimation.start();
//        return true;
//      }
//      return super.onTouchEvent(event);
//    }

    public void play(View view) {
        rocketAnimation.start();
    }
    public void stop(View view) {
        rocketAnimation.stop();
    }

}

ImageView rocketImage = (ImageView) findViewById(R.id.iv);   //获取布局文件中的ImageView,用来显示帧动画;

rocketImage.setBackgroundResource(R.drawable.beautiful_img);//设置ImageView的背景资源为beautiful_img.xml

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();//获得帧动画的引用,指向我们定义的beautiful_img.xml

rocketAnimation.start();  //利用AnimationDrawable类的start()方法播放指引的beautiful_img.xml帧动画;

rocketAnimation.stop();   //利用AnimationDrawable类的stop()方法停止播放指引的beautiful_img.xml帧动画;

(7)程序运行在真机上的效果如下:

点击"播放动画",就会播放动画,这里不方便显示手机的动态效果;

点击"停止播放",就会停止播放,再次点击"播放动画",从头(img00)开始播放。

时间: 2024-10-13 16:56:46

Android(java)学习笔记198:Android下的帧动画(Drawable Animation)的相关文章

java学习笔记1——window7下JDK环境变量配置图解

1. 首先下载Java安装工具包   http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 点击Accept License Agreement,然后根据自己的操作系统进行下载.下载完毕并且安装在C:\Program Files(x86)目录下. 2. win7系统右键计算机打开属性→高级系统设置→点击环境变量 3.配置环境变量 在“系统变量”中,设置3项属性,JAVA_HOME.P

android开发学习笔记000

使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个一直梦想走技术流的再疯狂一次.2014.08.06. 直奔主题——>android开发学习笔记001 android开发学习笔记000

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

java/android 设计模式学习笔记(16)---命令模式

这篇博客我们来介绍一下命令模式(Command Pattern),它是行为型设计模式之一.命令模式相对于其他的设计模式更为灵活多变,我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击关机命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,对于这一系列的命令,用户不用去管,用户只需点击系统的关机按钮即可完成如上一系列的命令.而我们的命令模式其实也与之相同,将一系列的方法调用封装,用户只需调用一个方法执行,那

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很