- 浏览: 516857 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
基于OPhone 2.0的2D动画实践(一)
OPhone平台开发, 2010-10-18 16:40:31
标签 : OPhone2.0 2D 动画
本系列文章主要介绍了OPhone 2.0 SDK提供的两种实现2D动画的方式:帧动画和补间动画。文章的每个知识点都提供了精彩的实例以向读者展示2D动画的具体实现方法。通过对本系列文章的学习,读者可利用2D动画实现非常绚丽的界面效果。
帧动画简介
如果读者使用过Flash,一定对帧动画非常熟悉。帧动画实际上就是由若干图像组成的动画。这些图像会以一定的时间间隔进行切换。电影的原理也有些类似于帧动画。一般电影是每秒25帧,也就是说,电影在每秒钟内会以相等的时间间隔连续播放25幅电影静态画面。由于人的视觉暂留,在这样的播放频率下,看起来电影才是连续的。在onDraw方法中使用invalidate方法不断刷新View的方式实现旋转动画。实际上,这也相当于帧动画,只是并不是利用若干静态图像的不断切换来制作帧动画,而是不断地画出帧动画中的每一帧图像。
AnimationDrawable与帧动画
OPhone中的帧动画需要在一个动画文件中指定动画中的静态图像和每一张静态图像停留的时间(单位:毫秒)。一般可以将所有图像的停留时间设为同一个值。动画文件采用了XML格式。该文件需要放在res\anim目录中。让我们先来建立一个简单的动画文件,首先在res\anim目录中建立一个test.xml文件,然后输入如下的内容:
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/anim1" android:duration="50" /> <item android:drawable="@drawable/anim2" android:duration="50" /> <item android:drawable="@drawable/anim3" android:duration="50" /> <item android:drawable="@drawable/anim4" android:duration="50" /> <item android:drawable="@drawable/anim5" android:duration="50" /> </animation-list>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/anim1" android:duration="50" /> <item android:drawable="@drawable/anim2" android:duration="50" /> <item android:drawable="@drawable/anim3" android:duration="50" /> <item android:drawable="@drawable/anim4" android:duration="50" /> <item android:drawable="@drawable/anim5" android:duration="50" /> </animation-list>
从anim.xml文件的内容可以看出,一个标准的动画文件由一个<animation-list>标签和若干<item>标签组成。其中<animation-list>标签的一个关键属性是android:oneshot,如果该属性值为true,表示帧动画只运行一遍,也就是从第1个图像切换到最后一个图像后,动画就会停止。如果该属性值为false,表示帧动画循环播放。android:oneshot是可选属性,默认值是false。
<item>标签的android:drawable属性指定了动画中的静态图像资源ID。帧动画播放的顺序就是<item>标签的定义顺序。android:duration属性指定了每个图像的停留时间。在test.xml文件中指定了每个图像的停留时间为50毫秒。android:drawable和android:duration都是必选属性,不能省略。
编写完动画文件后,就需要装载动画文件,并创建AnimationDrawable对象。AnimationDrawable是Drawable的子类,并在Drawable的基础上提供了控制动画的功能。读者可以使用如下的代码来根据test.xml文件创建AnimationDrawable对象。
- AnimationDrawable animationDrawable = (AnimationDrawable)getResources().getDrawable(R.anim.test);
AnimationDrawable animationDrawable = (AnimationDrawable)getResources().getDrawable(R.anim.test);
在创建完AnimationDrawable对象后,可以使用下面的代码将AnimationDrawable对象作为ImageView组件的背景。
- ImageView ivAnimView = (ImageView) findViewById(R.id.ivAnimView); ivAnimView.setBackgroundDrawable(animationDrawable);
ImageView ivAnimView = (ImageView) findViewById(R.id.ivAnimView); ivAnimView.setBackgroundDrawable(animationDrawable);
除了可以使用getDrawable方法装载test.anim文件外,还可以使用setBackgroundResource方法装载test.xml文件,并通过getBackground方法获得AnimationDrawable对象,代码如下:
- ImageView ivAnimView = (ImageView) findViewById(R.id.ivAnimView); ivAnimView.setBackgroundResource(R.anim.test); Object backgroundObject = ivAnimView.getBackground(); animationDrawable = (AnimationDrawable) backgroundObject;
ImageView ivAnimView = (ImageView) findViewById(R.id.ivAnimView); ivAnimView.setBackgroundResource(R.anim.test); Object backgroundObject = ivAnimView.getBackground(); animationDrawable = (AnimationDrawable) backgroundObject;
有了AnimationDrawable对象,就可以通过AnimationDrawable类的方法来控制帧动画。AnimationDrawable类中与帧动画相关的方法如下:
start:开始播放帧动画。
stop:停止播放帧动画。
setOneShot:设置是否只播放一遍帧动画。该方法的参数值与动画文件中的<animation-list>标签的android:oneshot属性值的含义相同。参数值为true表示只播放一遍帧动画,参数值为false表示循环播放帧动画。默认值为false。
addFrame:向AnimationDrawable对象中添加新的帧。该方法有两个参数,第1个参数是一个Drawable对象,表示添加的帧。该参数值可以是静态图像,也可以是另一个动画。第2个参数表示新添加的帧的停留时间。如果新添加的帧是动画。那么这个停留时间就是新添加的动画可以播放的时间。如果到了停留时间,不管新添加的动画是否播放完,都会切换到下一个静态图像或动画。
isOneShot:判断当前帧动画是否只播放一遍。该方法返回通过setOneShot方法或android:oneshot属性设置的值。
isRunning:判断当前帧动画是否正在播放。如果返回true,表示帧动画正在播放。返回false表示帧动画已停止播放。
getNumberOfFrames:返回动画的帧数,也就是<animation-list>标签中的<item>标签数。
getFrame:根据帧索引获得指定的帧的Drawable对象。帧从0开始。
getDuration:获得指定帧的停留时间。
如果想显示半透明的帧动画,可以通过Drawable类的setAlpha方法设置图像的透明度,该方法只有一个int类型的值,该值的范围是0至255。如果参数值是0,表示图像完全透明,如果参数值是255,表示图像完全不透明。
通过帧动画方式播放Gif动画
OPhone SDK中播放GIF动画的类库可能是因为GIF文件版本的问题,并不能播放所有的GIF动画文件,但我们可以采用帧动画的方式来播放GIF动画。
GIF动画文件本身由多个静态的GIF图像组成,因此,可以使用图像处理软件(如FireWorks)将GIF动画文件分解成多个GIF静态图像。然后将这些文件在res\anim目录中的动画文件中定义。frame_animation.xml文件的代码如下:
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/anim1" android:duration="50" /> <item android:drawable="@drawable/anim2" android:duration="50" /> </animation-list>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" > <item android:drawable="@drawable/anim1" android:duration="50" /> <item android:drawable="@drawable/anim2" android:duration="50" /> </animation-list>
为了演示在原有动画的基础上添加新的动画,本例引入了第2个GIF动画文件,并将这个GIF动画文件分解成6个GIF静态图像(文件名从myanim1.gif至myanim6.gif)。定义这6个GIF文件的动画文件是frame_animation1.xml。
本例的功能包含了"开始动画"、"停止动画"、"运行一次动画"和"添加动画",这4个功能分别对应于4个按钮。当单击【开始动画】按钮后,动画开始播放,如图1所示。单击【添加动画】按钮,播放完第1个动画后,又会继续播放第2个动画,如图2所示。在播放完第2个动画后,又会继续播放第1个动画。
图1 播放第1个动画
图2 播放第2个动画
本例的完整代码如下:
- package net.blogjava.mobile; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class Main extends Activity implements OnClickListener { private ImageView ivAnimView; private AnimationDrawable animationDrawable; private AnimationDrawable animationDrawable1; private Button btnAddFrame; @Override public void onClick(View view) { switch (view.getId()) { // 只播放一次动画 case R.id.btnOneShot: animationDrawable.setOneShot(true); animationDrawable.start(); break; // 循环播放动画 case R.id.btnStartAnim: animationDrawable.setOneShot(false); animationDrawable.stop(); animationDrawable.start(); break; // 停止播放动画 case R.id.btnStopAnim: animationDrawable.stop(); if (animationDrawable1 != null) { // 停止新添加的动画 animationDrawable1.stop(); } break; // 添加动画 case R.id.btnAddFrame: if (btnAddFrame.isEnabled()) { // 获得新添加动画的AnimationDrawable对象 animationDrawable1 = (AnimationDrawable) getResources() .getDrawable(R.anim.frame_animation1); // 添加动画,动画停留(播放)时间是2秒 animationDrawable.addFrame(animationDrawable1, 2000); btnAddFrame.setEnabled(false); } break; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnStartAnim = (Button) findViewById(R.id.btnStartAnim); Button btnStopAnim = (Button) findViewById(R.id.btnStopAnim); Button btnOneShot = (Button) findViewById(R.id.btnOneShot); btnAddFrame = (Button) findViewById(R.id.btnAddFrame); btnStartAnim.setOnClickListener(this); btnStopAnim.setOnClickListener(this); btnOneShot.setOnClickListener(this); btnAddFrame.setOnClickListener(this); ivAnimView = (ImageView) findViewById(R.id.ivAnimView); ivAnimView.setBackgroundResource(R.anim.frame_animation); Object backgroundObject = ivAnimView.getBackground(); animationDrawable = (AnimationDrawable) backgroundObject; } }
package net.blogjava.mobile; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class Main extends Activity implements OnClickListener { private ImageView ivAnimView; private AnimationDrawable animationDrawable; private AnimationDrawable animationDrawable1; private Button btnAddFrame; @Override public void onClick(View view) { switch (view.getId()) { // 只播放一次动画 case R.id.btnOneShot: animationDrawable.setOneShot(true); animationDrawable.start(); break; // 循环播放动画 case R.id.btnStartAnim: animationDrawable.setOneShot(false); animationDrawable.stop(); animationDrawable.start(); break; // 停止播放动画 case R.id.btnStopAnim: animationDrawable.stop(); if (animationDrawable1 != null) { // 停止新添加的动画 animationDrawable1.stop(); } break; // 添加动画 case R.id.btnAddFrame: if (btnAddFrame.isEnabled()) { // 获得新添加动画的AnimationDrawable对象 animationDrawable1 = (AnimationDrawable) getResources() .getDrawable(R.anim.frame_animation1); // 添加动画,动画停留(播放)时间是2秒 animationDrawable.addFrame(animationDrawable1, 2000); btnAddFrame.setEnabled(false); } break; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnStartAnim = (Button) findViewById(R.id.btnStartAnim); Button btnStopAnim = (Button) findViewById(R.id.btnStopAnim); Button btnOneShot = (Button) findViewById(R.id.btnOneShot); btnAddFrame = (Button) findViewById(R.id.btnAddFrame); btnStartAnim.setOnClickListener(this); btnStopAnim.setOnClickListener(this); btnOneShot.setOnClickListener(this); btnAddFrame.setOnClickListener(this); ivAnimView = (ImageView) findViewById(R.id.ivAnimView); ivAnimView.setBackgroundResource(R.anim.frame_animation); Object backgroundObject = ivAnimView.getBackground(); animationDrawable = (AnimationDrawable) backgroundObject; } }
总结
本文主要介绍了帧动画的原理,并介绍了如何利用OPhone SDK中的API加载并运行帧动画。最后给出了一个例子来用帧动画的方式播放gif动画。
作者介绍
李宁,东北大学计算机专业硕士,拥有超过10年的软件开发经验。曾任国内某知名企业项目经理;目前担任eoeandroid和ophonesdn版主;中国移动开发者社区OPhone专家;51CTO客作专家;CSDN博客专家。曾领导并参与开发了多个大中型项目。目前主要从事Android及其相关产品的研发。从2005年进入写作领域以来,为《程序员》、《电脑编程技巧与维护》、《电脑报》、IT168、天极网等平面媒体和网络媒体撰写了一百多篇原创技术和评论文章。并在个人blog(http://nokiaguy.blogjava.net)上发表了大量的原创技术文章。2007年获《电脑编程技巧与维护》优秀作者。2009年获得OPhone征文大赛二等奖。个人著作:《Android/OPhone开发完全讲义》、《人人都玩开心网:Ext JS+Android+SSH整合开发Web与移动SNS》、《Java Web开发速学宝典》。
发表评论
-
onInterceptTouchEvent和onTouchEvent调用时序
2012-02-08 08:44 1062onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 926Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1224Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1582【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1159Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1216android 中使用socket使native和frame ... -
android aidl iBinder理解
2011-06-01 11:51 2073在android中有一个程序员大量使用的操作,就是bindse ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1309Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 907近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1084AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 10511. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 867(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2184Android的Launcher成为系统 ... -
Launcher的启动过程
2011-05-12 19:36 22551. Launcher的启动过程 从网络上 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6570android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2897典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1176转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2491android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 35361.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1494在生成的apk目录下放 signapk.jar platfo ...
相关推荐
主要适用于OPhone1.5/2.0系统机型,如摩托罗拉MT720等 新增功能: 1、开启横屏功能,横着看,竖着看,想看就看; 2、保存搜索历史记录,随手可查; 3、开启笔选模式,随手一拖,复制轻松快捷; 4、“经常访问网站...
OPhone是基于Android系统的一个中国移动定制版,它提供了丰富的API和工具集,使得开发者可以充分利用其特性来创建高质量的2D游戏。本文将深入探讨在OPhone平台上实现2D游戏引擎涉及的技术点,以及相关的文档资源。 ...
中国移动 Android OPhone SDK (OPhone-sdk_windows-1.5.part1) 下载全部后(共6个)解压将其后缀改为.jar
05_OPhone平台2D游戏引擎实现——时间动画.doc
OPhone平台2D游戏引擎实现——物理引擎(一) OPhone平台开发, 2010-10-19 17:27:20 标签 : Ophone平台 2D 游戏 引擎 上一篇文章我们介绍了常见的各种游戏特效的实现,你现在可以很轻松的实现各种游戏中所需要...
《Ophone平台2D游戏引擎实现——物理引擎(一)(二)》 在移动游戏开发领域,Ophone平台曾是安卓系统的一个分支,由中国移动主导,为国内开发者提供了本土化的开发环境。在这个系列的文章中,我们将深入探讨如何在...
尽管Ophone平台的开发有一些特定挑战,但通过学习和实践,开发者可以克服这些问题,利用Box2D实现令人印象深刻的游戏效果。而深入理解物理引擎的工作原理,结合适当的编程技巧,将使游戏开发更加得心应手。
OPhone OS作为中国移动主导研发的智能手机操作系统,基于Android平台进行了本土化改造,支持TD-SCDMA网络,为国内用户提供了一种开放且适应中国市场的选择。然而,随着软件复杂度的增加,软件质量问题日益突出,MTBF...
OPhone是中国移动推出的一个基于Linux的智能手机操作系统,它融合了Android开放源码项目的优势,为开发者提供了丰富的API和工具集。 **一、安装前准备** 在开始安装OPhone SDK之前,你需要确保以下软件和硬件环境...
Ophone是由中国移动与Google合作开发的一款基于Android平台的智能手机操作系统,主要在中国市场推出。它的主要目标是为中国用户提供定制化的Android体验,同时也为中国移动的网络服务和应用商店提供集成。 1. **...
OPhone作为一款基于Linux的移动操作系统,针对移动互联网设备如手机、MID和NetBook提供了丰富的开发支持。本文通过复刻经典游戏——坦克大战,不仅教授基本的OPhone编程知识,还深入讲解2D游戏编程的核心理念。 ###...
OPhone是基于Android操作系统的一个中国移动定制版,它在Android的基础上增加了CDMA网络支持和一些中国移动的服务接口。因此,OPhone游戏编程在很大程度上与Android游戏开发相似,但可能涉及到一些特定于OPhone的API...
10. **图形与动画**(可能在未列出的章节中):Android提供了丰富的图形库和动画框架,包括2D绘图、OpenGL ES和各种动画效果。开发者可能会学习如何创建自定义视图和实现流畅的动画效果。 这些章节覆盖了Android...
Ophone是中国移动推出的一款基于Linux内核和Google Android系统修改的操作系统,旨在提供一个本土化的智能手机环境。 在这一打包的API中,我们可以找到以下关键知识点: 1. **API接口**:API(Application ...
而Ophone是基于Android系统,由中国移动定制的智能手机操作系统,它在Android的基础上添加了一些特定的功能和服务,以适应中国市场的特殊需求。 讲义中的源码部分可能包括以下内容: 1. **基础环境搭建**:如何...
- **第11章 2D动画**:教授如何实现流畅的二维动画效果。 - **第12章 OpenGLES编程**:介绍基于OpenGL ES的图形渲染技术。 - **第13章 资源、国际化与自适应**:讨论如何优化应用的资源管理,支持多语言环境和...
OPhone SDK for Windows是专为Windows操作系统设计的一款开发工具包,它主要用于构建和优化基于OPhone操作系统的移动应用。OPhone是由中国移动主导,基于Linux内核和Android平台的开源手机操作系统。这款SDK为开发者...
Ophone是中国移动推出的一个基于Android平台的智能手机操作系统,它允许开发者创建和优化应用程序,以适应中国移动通信网络的特性。SDK(Software Development Kit)包含了开发者构建Ophone应用所需的各种工具、库、...
中国移动推出的Ophone SDK(Open Phone SDK)是专为开发者设计的一套完整的开发工具包,旨在帮助开发者构建基于OMS(Open Mobile System)操作系统的智能手机应用。OMS是Android操作系统的一个分支,由中国移动定制...