- 浏览: 513860 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (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-19 14:12:28
标签 : 动画 2D OPhone2.0
本系列文章主要介绍了OPhone 2.0 SDK提供的两种实现2D动画的方式:帧动画和补间动画。文章的每个知识点都提供了精彩的实例以向读者展示2D动画的具体实现方法。通过对本系列文章的学习,读者可利用2D动画实现非常绚丽的界面效果。
旋转补间动画
通过<rotate>标签可以定义旋转补间动画。下面的代码定义了一个标准的旋转补间动画。
view plaincopy to clipboardprint?
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/linear_interpolator" android:fromDegrees="0"
android:toDegrees="360" android:pivotX="50%" android:pivotY="50%"
android:duration="10000" android:repeatMode="restart" android:repeatCount="infinite"/>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/linear_interpolator" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="10000" android:repeatMode="restart" android:repeatCount="infinite"/>
其中<rotate>标签有两个特殊的属性。它们的含义如下:
android:fromDegrees:表示旋转的起始角度。
android:toDegrees:表示旋转的结束角度。
在<rotate>标签中还使用如下两个属性设置旋转的次数和模式。
android:repeatCount:设置旋转的次数。该属性需要设置一个整数值。如果该值为0,表示不重复显示动画。也就是说,对于上面的旋转补间动画,只从0度旋转到360度,动画就会停止。如果属性值大于0,动画会再次显示该属性指定的次数。例如,如果android:repeatCount属性值为1。动画除了正常显示一次外,还会再显示一次。也就是说,前面的旋转补间动画会顺时针自转两周。如果想让补间动画永不停止,可以将android:repeatCount属性值设为"infinite"或-1。该属性的默认值是0。
android:repeatMode:设置重复的模式。默认值是restart。该属性只有当android:repeatCount设置成大于0的数或infinite才起作用。android:repeatMode属性值除了可以是restart外,还可以设为reverse,表示偶数次显示动画时会做与动画文件定义的方向相反的动作。例如,上面定义的旋转补间动画会在第1、3、5、...、2n - 1圈顺时针旋转,而在2、4、6、...、2n圈逆时针旋转。如果想使用Java代码来设置该属性,可以使用Animation类的setRepeatMode方法。该方法只接收一个int类型参数。可取的值是Animation.RESTART和Animation.REVERSE。
如果想通过Java代码实现旋转补间动画,可以创建android.view.animation.RotateAnimation对象。RotateAnimation类构造方法的定义如下:
view plaincopy to clipboardprint?
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY);
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY);
通过RotateAnimation类的构造方法可以设置旋转开始角度(fromDegrees)、旋转结束角度(toDegrees)、旋转支点横坐标(pivotX)和旋转支点纵坐标(pivotY)。
旋转补间动画实例
本例实现了两颗行星绕着一颗恒星旋转的效果。其中恒星会顺时针和逆时针交替旋转(android:repeatMode属性值为reverse)。效果如图1所示。
图1 旋转的星系
两颗行星和一颗恒星分别对应于一个动画文件。行星对应的两个动画文件的内容如下:
view plaincopy to clipboardprint?
hesper.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/linear_interpolator" android:fromDegrees="0"
android:toDegrees="360" android:pivotX="200%" android:pivotY="300%"
android:duration="5000" android:repeatMode="restart" android:repeatCount="infinite"/>
hesper.xml <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/linear_interpolator" android:fromDegrees="0" android:toDegrees="360" android:pivotX="200%" android:pivotY="300%" android:duration="5000" android:repeatMode="restart" android:repeatCount="infinite"/>
view plaincopy to clipboardprint?
earth.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/linear_interpolator" android:fromDegrees="0"
android:toDegrees="360" android:pivotX="200%" android:pivotY="300%"
android:duration="10000" android:repeatMode="restart" android:repeatCount="infinite"/>
earth.xml <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/linear_interpolator" android:fromDegrees="0" android:toDegrees="360" android:pivotX="200%" android:pivotY="300%" android:duration="10000" android:repeatMode="restart" android:repeatCount="infinite"/>
恒星对应的动画文件的内容如下:
view plaincopy to clipboardprint?
sun.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/linear_interpolator" android:fromDegrees="0"
android:toDegrees="360" android:pivotX="50%" android:pivotY="50%"
android:duration="20000" android:repeatMode="reverse" android:repeatCount="infinite"/>
sun.xml <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@anim/linear_interpolator" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="20000" android:repeatMode="reverse" android:repeatCount="infinite"/>
本例的主程序相对简单,只需要装载这3个动画文件,并开始动画即可,代码如下:
view plaincopy to clipboardprint?
package net.blogjava.mobile;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class Main extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView ivEarth = (ImageView) findViewById(R.id.ivEarth);
ImageView ivHesper = (ImageView) findViewById(R.id.ivHesper);
ImageView ivSun = (ImageView) findViewById(R.id.ivSun);
Animation earthAnimation = AnimationUtils.loadAnimation(this,R.anim.earth);
Animation hesperAnimation = AnimationUtils.loadAnimation(this,R.anim.hesper);
Animation sunAnimation = AnimationUtils.loadAnimation(this, R.anim.sun);
ivEarth.startAnimation(earthAnimation);
ivHesper.startAnimation(hesperAnimation);
ivSun.startAnimation(sunAnimation);
}
}
package net.blogjava.mobile; import android.app.Activity; import android.os.Bundle; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView ivEarth = (ImageView) findViewById(R.id.ivEarth); ImageView ivHesper = (ImageView) findViewById(R.id.ivHesper); ImageView ivSun = (ImageView) findViewById(R.id.ivSun); Animation earthAnimation = AnimationUtils.loadAnimation(this,R.anim.earth); Animation hesperAnimation = AnimationUtils.loadAnimation(this,R.anim.hesper); Animation sunAnimation = AnimationUtils.loadAnimation(this, R.anim.sun); ivEarth.startAnimation(earthAnimation); ivHesper.startAnimation(hesperAnimation); ivSun.startAnimation(sunAnimation); } }
透明度补间动画
通过<alpha>标签可以定义透明度补间动画。下面的代码定义了一个标准的透明度补间动画。
view plaincopy to clipboardprint?
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.1" android:duration="2000" />
<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.1" android:duration="2000" />
其中android:fromAlpha和android:toAlpha属性分别表示起始透明度和结束透明度。这两个属性的值都在0.0和1.0之间。属性值为0.0表示完全透明,属性值为1.0表示完全不透明。
如果想通过Java代码实现透明度补间动画,可以创建android.view.animation.AlphaAnimation对象。AlphaAnimation类构造方法的定义如下:
view plaincopy to clipboardprint?
public AlphaAnimation(float fromAlpha, float toAlpha);
public AlphaAnimation(float fromAlpha, float toAlpha);
通过AlphaAnimation类的构造方法可以设置起始透明度(fromAlpha)和结束透明度(toAlpha)
透明度补间动画实例
本例将前面介绍的多种动画效果进行结合实现了投掷炸1弹,并爆炸的特效。在本例中采用的动画类型有帧动画、移动补间动画、缩放补间动画和透明度补间动画。
其中使用了帧动画播放了一个爆炸的GIF动画;使用移动补间动画实现了炸1弹被投下仍然会向前移动的偏移效果;缩放补间动画实现了当炸1弹被投下时逐渐缩小的效果。透明度补间动画实现了炸1弹被投下时逐渐模糊的效果。当运行本例后,会在屏幕下方正中间显示一个炸1弹,如图2所示。然后触摸这个炸1弹,炸1弹开始投掷,逐渐变小和模糊,如图3所示。当炸1弹变得很小、很模糊时,会播放GIF动画来显示爆炸效果,并播放爆炸的声音。如图4所示。
图2 初始状态的炸1弹
图3 炸1弹逐渐变小和模糊
图4 炸1弹爆炸的效果
本例的实现代码如下:
view plaincopy to clipboardprint?
package net.blogjava.mobile;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
import android.widget.ImageView;
public class Main extends Activity implements OnTouchListener,AnimationListener
{
private ImageView ivMissile;
private MyImageView ivBlast;
private AnimationDrawable animationDrawable;
private Animation missileAnimation;
@Override
public boolean onTouch(View view, MotionEvent event)
{
// 触摸炸1弹后,开始播放动画
ivMissile.startAnimation(missileAnimation);
return false;
}
@Override
public void onAnimationEnd(Animation animation)
{
// 在播放投掷炸1弹动画结束后,显示MyImageView组件,并将显示炸1弹的ImageView组件隐藏
ivBlast.setVisibility(View.VISIBLE);
ivMissile.setVisibility(View.INVISIBLE);
try
{
// 开始播放爆炸的声音
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.bomb);
mediaPlayer.stop();
mediaPlayer.prepare();
mediaPlayer.start();
}
catch (Exception e)
{
}
animationDrawable.stop();
// 播放爆炸效果动画
animationDrawable.start();
}
@Override
public void onAnimationRepeat(Animation animation)
{
}
@Override
public void onAnimationStart(Animation animation)
{
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ivMissile = (ImageView) findViewById(R.id.ivMissile);
ivMissile.setOnTouchListener(this);
ivBlast = (MyImageView) findViewById(R.id.ivBlast);
ivBlast.setBackgroundResource(R.anim.blast);
Object backgroundObject = ivBlast.getBackground();
animationDrawable = (AnimationDrawable) backgroundObject;
ivBlast.animationDrawable = animationDrawable;
missileAnimation = AnimationUtils.loadAnimation(this, R.anim.missile);
missileAnimation.setAnimationListener(this);
// 在程序启动后,将显示爆炸效果的MyImageView组件隐藏
ivBlast.setVisibility(View.INVISIBLE);
ivBlast.ivMissile = ivMissile;
}
}
package net.blogjava.mobile; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.media.MediaPlayer; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Animation.AnimationListener; import android.widget.ImageView; public class Main extends Activity implements OnTouchListener,AnimationListener { private ImageView ivMissile; private MyImageView ivBlast; private AnimationDrawable animationDrawable; private Animation missileAnimation; @Override public boolean onTouch(View view, MotionEvent event) { // 触摸炸1弹后,开始播放动画 ivMissile.startAnimation(missileAnimation); return false; } @Override public void onAnimationEnd(Animation animation) { // 在播放投掷炸1弹动画结束后,显示MyImageView组件,并将显示炸1弹的ImageView组件隐藏 ivBlast.setVisibility(View.VISIBLE); ivMissile.setVisibility(View.INVISIBLE); try { // 开始播放爆炸的声音 MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.bomb); mediaPlayer.stop(); mediaPlayer.prepare(); mediaPlayer.start(); } catch (Exception e) { } animationDrawable.stop(); // 播放爆炸效果动画 animationDrawable.start(); } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationStart(Animation animation) { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ivMissile = (ImageView) findViewById(R.id.ivMissile); ivMissile.setOnTouchListener(this); ivBlast = (MyImageView) findViewById(R.id.ivBlast); ivBlast.setBackgroundResource(R.anim.blast); Object backgroundObject = ivBlast.getBackground(); animationDrawable = (AnimationDrawable) backgroundObject; ivBlast.animationDrawable = animationDrawable; missileAnimation = AnimationUtils.loadAnimation(this, R.anim.missile); missileAnimation.setAnimationListener(this); // 在程序启动后,将显示爆炸效果的MyImageView组件隐藏 ivBlast.setVisibility(View.INVISIBLE); ivBlast.ivMissile = ivMissile; } }
总结
本文主要介绍了旋转补间动画和透明度补间动画。通过将四种补间动画结合使用,可以实现非常有趣的动画效果。
作者介绍
李宁,东北大学计算机专业硕士,拥有超过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 1049onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 915Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1212Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1572【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1148Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1203android 中使用socket使native和frame ... -
android aidl iBinder理解
2011-06-01 11:51 2064在android中有一个程序员大量使用的操作,就是bindse ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1296Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 898近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1074AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 10381. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 859(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2171Android的Launcher成为系统 ... -
Launcher的启动过程
2011-05-12 19:36 22441. Launcher的启动过程 从网络上 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6560android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2885典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1169转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2482android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 35191.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1483在生成的apk目录下放 signapk.jar platfo ...
相关推荐
主要适用于OPhone1.5/2.0系统机型,如摩托罗拉MT720等 新增功能: 1、开启横屏功能,横着看,竖着看,想看就看; 2、保存搜索历史记录,随手可查; 3、开启笔选模式,随手一拖,复制轻松快捷; 4、“经常访问网站...
OPhone平台2D游戏引擎实现总汇主要涵盖了在OPhone操作系统上开发2D游戏的关键技术和实践过程。OPhone是基于Android系统的一个中国移动定制版,它提供了丰富的API和工具集,使得开发者可以充分利用其特性来创建高质量...
中国移动 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平台的MTBF测试研究与应用”中,作者深入探讨了如何在OPhone OS智能移动终端上进行有效的MTBF测试。 1. 研究背景与意义: 21世纪以来,随着通信网络的发展,特别是Android系统的出现,...
OPhone SDK,全称为Open Mobile Phone SDK,是基于Android SDK的扩展,主要用于开发针对OPhone操作系统的应用程序。OPhone是中国移动推出的一个基于Linux的智能手机操作系统,它融合了Android开放源码项目的优势,为...
- Ophone OS在2009年首次发布,随后经历了多个版本迭代,包括Ophone 2.0、2.5和3.0等,不断改进性能和功能。 - 随着Android系统的全球普及,Ophone逐渐淡出市场,许多Ophone设备后来升级到纯正的Android系统。 4....
而Ophone是基于Android系统,由中国移动定制的智能手机操作系统,它在Android的基础上添加了一些特定的功能和服务,以适应中国市场的特殊需求。 讲义中的源码部分可能包括以下内容: 1. **基础环境搭建**:如何...
10. **图形与动画**(可能在未列出的章节中):Android提供了丰富的图形库和动画框架,包括2D绘图、OpenGL ES和各种动画效果。开发者可能会学习如何创建自定义视图和实现流畅的动画效果。 这些章节覆盖了Android...
OPhone作为一款基于Linux的移动操作系统,针对移动互联网设备如手机、MID和NetBook提供了丰富的开发支持。本文通过复刻经典游戏——坦克大战,不仅教授基本的OPhone编程知识,还深入讲解2D游戏编程的核心理念。 ###...
OPhone SDK for Windows是专为Windows操作系统设计的一款开发工具包,它主要用于构建和优化基于OPhone操作系统的移动应用。OPhone是由中国移动主导,基于Linux内核和Android平台的开源手机操作系统。这款SDK为开发者...
OPhone是基于Android操作系统的一个中国移动定制版,它在Android的基础上增加了CDMA网络支持和一些中国移动的服务接口。因此,OPhone游戏编程在很大程度上与Android游戏开发相似,但可能涉及到一些特定于OPhone的API...
**标题与描述解析** "Ophone SDK Linux 1.0 setup" 指的是一个针对Linux操作系统...通过这个Ophone SDK Linux 1.0 setup,开发者可以全面地了解和实践Ophone平台上的应用开发,同时享受Linux环境带来的稳定性和效率。
中国移动推出的Ophone SDK(Open Phone SDK)是专为开发者设计的一套完整的开发工具包,旨在帮助开发者构建基于OMS(Open Mobile System)操作系统的智能手机应用。OMS是Android操作系统的一个分支,由中国移动定制...
OPhone是基于Android系统定制的中国移动主导的智能手机操作系统,它保留了Android的大部分特性,同时也加入了一些特定的功能和服务,如OMS(Open Mobile System)。在OPhone开发部分,讲义会讲解OPhone与Android的...
Ophone是中国移动推出的一款基于Linux内核和Google Android系统修改的操作系统,旨在提供一个本土化的智能手机环境。 在这一打包的API中,我们可以找到以下关键知识点: 1. **API接口**:API(Application ...
- **第11章 2D动画**:教授如何实现流畅的二维动画效果。 - **第12章 OpenGLES编程**:介绍基于OpenGL ES的图形渲染技术。 - **第13章 资源、国际化与自适应**:讨论如何优化应用的资源管理,支持多语言环境和...