Android动画的实现 上

       在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代码
  1. <?xml version="1.0" encoding="utf-8"?>  

       composite_animation.xml

XML/HTML代码
  1.   

       rotate_animation.xml

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  

       scale_animation.xml

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  

       translate_animation.xml

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  

       3、MainActivity.java的内容如下:

Java代码
  1. package android.basic.lesson24;   
  2.   
  3. import android.app.Activity;   
  4. import android.os.Bundle;   
  5. import android.view.View;   
  6. import android.view.View.OnClickListener;   
  7. import android.view.animation.Animation;   
  8. import android.view.animation.AnimationUtils;   
  9. import android.widget.ImageButton;   
  10.   
  11. public class MainAnimation extends Activity {   
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {   
  15.         super.onCreate(savedInstanceState);   
  16.         setContentView(R.layout.main);   
  17.   
  18.         //定义UI组件   
  19.         final ImageButton ib1 = (ImageButton) findViewById(R.id.ImageButton01);   
  20.         final ImageButton ib2 = (ImageButton) findViewById(R.id.ImageButton02);   
  21.         final ImageButton ib3 = (ImageButton) findViewById(R.id.ImageButton03);   
  22.         final ImageButton ib4 = (ImageButton) findViewById(R.id.ImageButton04);   
  23.         final ImageButton ib5 = (ImageButton) findViewById(R.id.ImageButton05);   
  24.   
  25.         //定义监听器   
  26.         OnClickListener ocl = new OnClickListener() {   
  27.   
  28.             @Override  
  29.             public void onClick(View v) {   
  30.                 switch (v.getId()) {   
  31.                 case R.id.ImageButton01:   
  32.                     //创建Animation对象   
  33.                     Animation ani1 = AnimationUtils.loadAnimation(   
  34.                             getApplicationContext(), R.anim.alpha_animation);   
  35.                     //组件播放动画   
  36.                     ib1.startAnimation(ani1);   
  37.                     break;   
  38.                 case R.id.ImageButton02:   
  39.                     Animation ani2 = AnimationUtils.loadAnimation(   
  40.                             getApplicationContext(), R.anim.scale_animation);   
  41.                     ib2.startAnimation(ani2);   
  42.                     break;   
  43.                 case R.id.ImageButton03:   
  44.                     Animation ani3 = AnimationUtils.loadAnimation(   
  45.                             getApplicationContext(), R.anim.translate_animation);   
  46.                     ib3.startAnimation(ani3);   
  47.                     break;   
  48.                 case R.id.ImageButton04:   
  49.                     Animation ani4 = AnimationUtils.loadAnimation(   
  50.                             getApplicationContext(), R.anim.rotate_animation);   
  51.                     ib4.startAnimation(ani4);   
  52.                     break;   
  53.                 case R.id.ImageButton05:   
  54.                     Animation ani5 = AnimationUtils.loadAnimation(   
  55.                             getApplicationContext(), R.anim.composite_animation);   
  56.                     ib5.startAnimation(ani5);   
  57.                     break;   
  58.                 }   
  59.   
  60.             }   
  61.   
  62.         };   
  63.   
  64.         //绑定监听器   
  65.         ib1.setOnClickListener(ocl);   
  66.         ib2.setOnClickListener(ocl);   
  67.         ib3.setOnClickListener(ocl);   
  68.         ib4.setOnClickListener(ocl);   
  69.         ib5.setOnClickListener(ocl);   
  70.     }   
  71. }  

       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代码
  1. <?xml version="1.0" encoding="utf-8"?>  

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

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <BUTTON type=submit>  
  3. </BUTTON>  
  4. <BUTTON type=submit>  
  5. </BUTTON>  

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

Java代码
  1. package android.basic.lesson24;   
  2.   
  3. import android.app.Activity;   
  4. import android.graphics.drawable.AnimationDrawable;   
  5. import android.os.Bundle;   
  6. import android.view.View;   
  7. import android.view.View.OnClickListener;   
  8. import android.widget.Button;   
  9. import android.widget.ImageView;   
  10.   
  11. public class MainFrameAnimaton extends Activity {   
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {   
  15.         super.onCreate(savedInstanceState);   
  16.         setContentView(R.layout.main);   
  17.   
  18.         // 定义UI组件   
  19.         Button b1 = (Button) findViewById(R.id.Button01);   
  20.         Button b2 = (Button) findViewById(R.id.Button02);   
  21.         final ImageView iv = (ImageView) findViewById(R.id.ImageView01);   
  22.   
  23.         // 定义点击监听器   
  24.         OnClickListener ocl = new OnClickListener() {   
  25.   
  26.             @Override  
  27.             public void onClick(View v) {   
  28.   
  29.                 // 定义"动画可画"对象,我起的名字,你看着不顺眼就当不存在^_^   
  30.                 AnimationDrawable ad = (AnimationDrawable) iv.getBackground();   
  31.   
  32.                 switch (v.getId()) {   
  33.                 case R.id.Button01:   
  34.                     //调用动画可画对象的开始播放方法   
  35.                     ad.start();   
  36.                     break;   
  37.                 case R.id.Button02:   
  38.                     //调用动画可画对象的停止播放方法   
  39.                     ad.stop();   
  40.                     break;   
  41.                 }   
  42.             }   
  43.         };   
  44.   
  45.         //绑定监听器   
  46.         b1.setOnClickListener(ocl);   
  47.         b2.setOnClickListener(ocl);   
  48.     }   
  49. }  

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

逐帧动画示例一

逐帧动画示例二

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

逐帧动画示例三

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一季2:HI3518EV200的初体验(检测板子是否正常工作)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、检测步骤 1、设置PC主机有线网卡的ip地址设为192.168.1.10&#xff0c;关闭防火墙。 2、虚拟机桥接到有线网卡&#xff0c;并设置虚拟机的静态ip地址为192.168.1.141。 3、在uboot控制台设置ub…

第一季3:HI3518E方案整体架构介绍(硬件和软件支持)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、硬件资源 &#xff08;1&#xff09;HI3518E单芯片提供&#xff1a;CPU DSP 内置64MB DDR ETHERNET MAC。 &#xff08;2&#xff09;外置16MB的SPI接口的Flash用来存放程序&#xff08;ubo…

(一)FlexViewer之整体框架解析

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架。目前有两种版本&#xff0c;一种…

三阶魔方复原操作方法

在女票的指导下&#xff0c;我花了一个晚上学习如何复原三阶魔方&#xff0c;虽然是知其然不知其所以然&#xff0c;但好歹也能把魔方复原了。下面都是一些傻瓜式的操作&#xff0c;里面涉及的理论我不清楚。魔方总共分三层&#xff0c;下面是每层复原方法。 第一层 1、先以“…

Phaser开源2d引擎 javascript/html5游戏框架

功能特点&#xff08;Features&#xff09; 易维护代码&#xff08;Easy Asset Loading&#xff09; Phaser可以加载图片&#xff0c;音频文件&#xff0c;数据文件&#xff0c;文本文件和自动解析精灵图和纹理地图集数据&#xff08;出口纹理封隔器或Flash CS6&#xf…

8大排序算法图文讲解转

本文链接&#xff1a;http://www.cricode.com/3212.html 作者&#xff1a;快课网——Jay13 转载请务必保留作者出处&#xff0c;谢谢&#xff01; 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大…

Immutable Collections(3)Immutable List实现原理(中)变化中的不变

Immutable Collections(3)Immutable List实现原理(中)变化中的不变 文/玄魂 前言 在上一篇文章&#xff08;Immutable Collections&#xff08;2&#xff09;ImmutableList<T>实现原理.&#xff08;上&#xff09;&#xff09;,分析了&#xff09;ImmutableList<T>…

大话Fragment管理

大话Fragment管理 上一个项目遇到了一个Activity 管理30个Fragment的情况&#xff0c;刚开始的时候真的管理的焦头烂额&#xff0c;但是后来不停的研究api文档&#xff0c;渐渐的明白了android的Fragment管理 体系。下面用…

第一季4:Hi3518E_SDK_Vx.x.x.x的SDK目录结构

一、Hi3518E_SDK_V1.0.3.0.tgz的位置 “Hi3518E_SDK_V1.0.3.0.tgz”位于“Hi3518E V200R001C01SPC030”中&#xff0c;其目录包含关系如下。 Hi3518E_SDK_V1.0.3.0.tgz 解压后内部文件组织如下。 二、执行SDK展开脚本sdk.unpack后的目录关系 将Hi3518E_SDK_V1.0.3.0.tgz拷贝到…

第一季6:海思方案中uboot、kernel和rootfs的烧写方法

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、概述 因为所用的板子默认从SPI Flash启动&#xff0c;因此本文主要讲如何“使用tftp&#xff0c;烧写映像文件&#xff08;uboot、kernel、rootfs&#xff09;到SPI Flash”。另外海思还提供了“…

Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0

2019独角兽企业重金招聘Python工程师标准>>> 1、Struts2 1.1、了解Struts2 Struts2是基于MVC设计模式的Java Web框架技术之一&#xff0c;按照MVC设计思想把Java Web应用程序分为&#xff1a; 控制器层&#xff0c;包括核心控制器FilterDispatcher和业务控制器Actio…

高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、高地址和低地址 二、高字节低字节 如int a16777220&#xff0c;化为十六进制是0x01 00 00 04&#xff0c;则04属于低字节&#xff0c;01属于高字节。 三、大小端模式 &#xff08;1&#xff09;如果a在内…

漫谈数据挖掘从入门到进阶

入门&#xff1a;数据挖掘入门的书籍&#xff0c;中文的大体有这些&#xff1a;Jiawei Han的《数据挖掘概念与技术》Ian H. Witten / Eibe Frank的《数据挖掘 实用机器学习技术》Tom Mitchell的《机器学习》TOBY SEGARAN的《集体智慧编程》Anand Rajaraman的《大数据》Pang-Nin…

(转)Asp.Net生命周期系列一

原文地址&#xff1a;http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说&#xff0c;一直都是一个难题&#xff0c;很多程序员不了解生命周期&#xff0c;导致使用Asp.Net做开发感觉很不灵活&#xff0c;感觉太多东…

与TCP有关的面试内容

以下内容源于网络资料的学习与整理。 参考博客 TCP/IP四层模型 - BlueTzar - 博客园&#xff08;OSI参考模型和TCP模型的详解&#xff0c;包括格式&#xff09; TCP/IP协议-为什么说TCP是可靠连接_shuaixio的博客-CSDN博客&#xff08;为什么可靠及优缺点&#xff09; 两张动图…

JUnit4概述

JUnit4是JUnit框架有史以来的最大改进&#xff0c;其主要目标便是利用Java5的Annotation特性简化测试用例的编写。先简单解释一下什么是Annotation&#xff0c;这个单词一般是翻译成元数据。元数据是什么&#xff1f;元数据就是描述数据的数据。也就是说&#xff0c;这个东西在…

正则表达式30分钟入门教程(转)

分享到一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多...百度分享首页 | 正则表达式30分钟入门教程 | 常用正则表达式| 正则表达式速查表 | 正则表达式测试工具 | 正则表达式 | 正则练习器在线版 正…

进程、线程简介

以下内容源于网络资源的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 参考博客 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html&#xff08;通俗理解&#xff09; https://blog.csdn.net/chen_geng/article/details/51613445&#xff08;表格…

使用keil建立标准STM32工程模版(图文详细版!)

1. 模板工程的创建(超级详细版&#xff0c;使用的是keil 4.5版本) 1.1创建工程目录 良好的工程结构能让文件的管理更科学&#xff0c;让开发更容易更方便&#xff0c;希望大家养成良好的习惯&#xff0c;使用具有合理结构的工程目录&#xff0c;当你着手于较大的软件项目时&a…

android模拟机新闻APP,DavidTGNewsProject

DavidTGNewsProject##【Android】最新主流新闻app功能实现。仿网易,搜狐等新闻客户端(原创作品&#xff0c;转载请说明出处)先给大家看一下效果图&#xff1a;这个项目总体来说虽然不是特别难&#xff0c;但是确实非常常用的功能。是业余时间自己写的一个小项目。以前我们写的时…