基于OPhone 2.0的2D卡通片实践(一)
基于OPhone 2.0的2D动画实践(一)基于OPhone 2.0的2D动画实践(一)OPhone平台开发, 2010-10-18 16:40:31 标
基于OPhone 2.0的2D动画实践(一)
基于OPhone 2.0的2D动画实践(一)OPhone平台开发, 2010-10-18 16:40:31 标签 : OPhone2.0 2D 动画
从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对象。
为了演示在原有动画的基础上添加新的动画,本例引入了第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; } }
总结
本文主要介绍了帧动画的原理,并介绍了如何利用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开发速学宝典》。