在Android系统中也能经常见到动画,那么如何实现动画效果呢?本文就来为大家介绍动画的实现方式。

Android中动画的实现分两种方式,一种方式是补间动画Tween Animation,就是说你定义一个开始和结束,中间的部分由程序运算得到。另一种叫逐帧动画Frame Animation,就是说一帧一帧的连起来播放就变成了动画。有点Flash基础的同学理解起来会很容易。接下来我们一个一个学习。

一、补间动画Tween Animation

Android中实现补间动画的思路是这样的,

1、首先用XML定义一个动画效果

2、依据这个XML使用AnimationUtils工具类创建一个Animationd对象

3、调用View组件的startAnimation方法实现动画。

接下来我们用一个例子来看一下。

1、创建一个项目Lesson24_Animation,主Activity名字叫MainActivity.java

2、在res目录下创建一个anim目录,在目录下创建下面五个动画定义文件,需要注意的是这5个文件在是2.2下调试通过的,网上很多文档的xml是无法通过IDE的检查的,可能是新版本检查更严格了。

alpha_animation.xml

XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>

composite_animation.xml

XML/HTML代码

rotate_animation.xml

XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>

scale_animation.xml

XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>

translate_animation.xml

XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>

3、MainActivity.java的内容如下:

Java代码packageandroid.basic.lesson24;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.view.animation.Animation;

importandroid.view.animation.AnimationUtils;

importandroid.widget.ImageButton;

publicclassMainAnimationextendsActivity {

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//定义UI组件

finalImageButton ib1 = (ImageButton) findViewById(R.id.ImageButton01);

finalImageButton ib2 = (ImageButton) findViewById(R.id.ImageButton02);

finalImageButton ib3 = (ImageButton) findViewById(R.id.ImageButton03);

finalImageButton ib4 = (ImageButton) findViewById(R.id.ImageButton04);

finalImageButton ib5 = (ImageButton) findViewById(R.id.ImageButton05);

//定义监听器

OnClickListener ocl =newOnClickListener() {

@Override

publicvoidonClick(View v) {

switch(v.getId()) {

caseR.id.ImageButton01:

//创建Animation对象

Animation ani1 = AnimationUtils.loadAnimation(

getApplicationContext(), R.anim.alpha_animation);

//组件播放动画

ib1.startAnimation(ani1);

break;

caseR.id.ImageButton02:

Animation ani2 = AnimationUtils.loadAnimation(

getApplicationContext(), R.anim.scale_animation);

ib2.startAnimation(ani2);

break;

caseR.id.ImageButton03:

Animation ani3 = AnimationUtils.loadAnimation(

getApplicationContext(), R.anim.translate_animation);

ib3.startAnimation(ani3);

break;

caseR.id.ImageButton04:

Animation ani4 = AnimationUtils.loadAnimation(

getApplicationContext(), R.anim.rotate_animation);

ib4.startAnimation(ani4);

break;

caseR.id.ImageButton05:

Animation ani5 = AnimationUtils.loadAnimation(

getApplicationContext(), R.anim.composite_animation);

ib5.startAnimation(ani5);

break;

}

}

};

//绑定监听器

ib1.setOnClickListener(ocl);

ib2.setOnClickListener(ocl);

ib3.setOnClickListener(ocl);

ib4.setOnClickListener(ocl);

ib5.setOnClickListener(ocl);

}

}

4、运行程序,查看结果。

原始图:

点击第一个按钮的透明度变化效果:

点击第二个按钮的缩放效果,这里看到的是两个缩放效果同时作用叠加的效果。也就是说默认情况下效果是同时发生的,而不是先后执行的,除非你使用 startoffset属性指定。同学们看这一讲最重要的还是自己练习来体会。

点击第三个按钮的位移效果,这个例子里我们可以清楚看到android:startOffset=”2000″的作用,数独按钮前2秒向右移了300像素,后2秒又回到原处,注意第二个translate中的负值参数,它清晰的告诉我们位移数据是相对自身当时位置的。

点击第四个按钮的旋转效果,负的度数表示逆时针旋转。

点击第五个按钮的复合动画效果,这个效果的代码我是直接粘贴的官方帮助文档里的代码,看着效果还不赖^_^

二、逐帧动画

我们知道,Android是不支持Gif动画的,也不建议使用Gif动画,比较不幸的是到Android 2.2版本为止也不支持APNG这种png动画格式,所以我们制作只能用多张png图片逐帧播放的方式来实现动画效果。下面我们用一个例子来学习一下逐帧动画。

1、新建一个项目Lesson24_FrameAnimation ,主Acitivy名字叫 MainFrameAnimation.java。

2、将下图中的每个小图片分开,即25张小图片,拷贝到res/drawable目录下。

3、在res/anim目录下,新建一个文件 firefox_animation.xml 内容如下:

XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>

4、在res/layout/main.xml中写入如下内容:

XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>

5、在MainFrameAnimation.javaz中的内容如下:

Java代码packageandroid.basic.lesson24;

importandroid.app.Activity;

importandroid.graphics.drawable.AnimationDrawable;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.ImageView;

publicclassMainFrameAnimatonextendsActivity {

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 定义UI组件

Button b1 = (Button) findViewById(R.id.Button01);

Button b2 = (Button) findViewById(R.id.Button02);

finalImageView iv = (ImageView) findViewById(R.id.ImageView01);

// 定义点击监听器

OnClickListener ocl =newOnClickListener() {

@Override

publicvoidonClick(View v) {

// 定义"动画可画"对象,我起的名字,你看着不顺眼就当不存在^_^

AnimationDrawable ad = (AnimationDrawable) iv.getBackground();

switch(v.getId()) {

caseR.id.Button01:

//调用动画可画对象的开始播放方法

ad.start();

break;

caseR.id.Button02:

//调用动画可画对象的停止播放方法

ad.stop();

break;

}

}

};

//绑定监听器

b1.setOnClickListener(ocl);

b2.setOnClickListener(ocl);

}

}

6、运行程序,查看效果:

换个背景再来一张,可以看到png动画的透明就是不一般^_^

顺便提一下,我的这些可爱的小狐狸图标,是在APNG这个项目中找到的,感兴趣的朋友去搜搜APNG吧。

本节关于动画的内容先讲到这里,欢迎继续关注。

2012年8月26日

动画android,Android学习指南之二十四:Android动画的实现 上相关推荐

  1. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  2. mysql循环查询一个表中的数据并进行修改_JavaScript学习笔记(二十四)-- MYSQL基础操作...

    MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...

  3. 深度学习入门(二十四)卷积神经网络——填充和步幅

    深度学习入门(二十四)卷积神经网络--填充和步幅 前言 卷积神经网络--填充和步幅 课件 填充 步幅 总结 课本 1 填充 2 步幅 3 小结 前言 核心内容来自博客链接1博客连接2希望大家多多支持作 ...

  4. 链接mysql_JavaScript学习笔记(二十四)-- MYSQL基础操作

    MYSQL mysql 是一个数据库的名字 和 php 合作的比较好的数据库 之前我们说过一个问题,前端向后端索要数据,后端就是去数据库中查询数据,返回给前端 接下来就聊聊使用 php 操作数据库 M ...

  5. Android开发笔记(一百二十四)自定义相册

    画廊Gallery Gallery是一个早期的画廊控件,左右滑动手势可展示内嵌的图片列表,类似于一个平面的万花筒.虽然Android现在将Gallery标记为Deprecation(表示已废弃),建议 ...

  6. Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图

    原址:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍是用MediaMuxer与MediaExtractor进入音视频 ...

  7. Android进阶 二十四 Android UI---界面开发推荐颜色

    Android UI---界面开发推荐颜色   在Android开发过程中,总要给app添加一些背景,个人认为使用纯色调便可以达到优雅的视觉效果. 补充一些常用的颜色值:colors.xml < ...

  8. Android实例-手机安全卫士(二十四)-绑定SIM卡

    一.目标. 使用TelephonyManager对象获取手机相关信息,用SharedPreferences对象保存配置信息. 二.代码实现. 1.为"绑定SIM卡"按钮添加id(取 ...

  9. verilog for循环_HDLBits:在线学习 Verilog (二十四 · Problem 115-119)

    本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同 ...

最新文章

  1. 多变量线性回归程序实现
  2. android 退出app代码_uniapp退出APP应用(IOS+安卓)
  3. Unmarshalling Error: unexpected element 错误的解决
  4. Day4 python基础
  5. 下列选项中不符合python语言变量命名规则的是_学习Python第二日--基本概念和类型...
  6. visualvm安装插件
  7. 第2章 创建你的第一个 LISP 程序 Creating Your First Lisp Progr
  8. 数值计算原理_数值方法中的有限元法、有限差分法、有限体积法的区别
  9. xp显示连接上不了网络连接服务器地址,xp本地连接受限制|windows xp系统本地连接提示受限制或无连接怎么办...
  10. 在线阅读.epub文件的网站
  11. 【python ++ opencv + pytorch 】车牌提取、分割、识别
  12. 基于javaweb的平行志愿管理系统(java+springboot+mybatis+vue+mysql)
  13. linux一些简单的操作命令
  14. html dom ready,【js】实现DOMReady
  15. 机器学习中为什么需要梯度下降_机器学习101:一文带你读懂梯度下降
  16. 题解 【网络流24题】太空飞行计划
  17. 如何选择MySQL中除一列外的所有列
  18. Log4j2 zero day(CVE-2021-44228) 漏洞浅析
  19. C#超级通信调试工具[v1.0][全新发布]
  20. HTML邮件基本使用方法

热门文章

  1. 当年称阿里无底线的王兴,做了一件真正没有底线的事情
  2. 试题 算法训练 一元三次方程求解
  3. 四.redis的基础+实战
  4. 细数开源的华为云组件库有哪些?
  5. 小狐狸的测试理论基础知识总结
  6. centos7.5安装无线网卡驱动
  7. 计算机专业学生该如何提高自己?
  8. Matlab 点云旋转之四元数插值
  9. Python学习 第一天任务 (四:【基于Python编程从入门到实践】动手试一试)
  10. 申通 圆通 快递发货的运费计算方式