当前位置:  编程技术>移动开发
本页文章导读:
    ▪基于OPhone 2.0的2D卡通片实践(一)        基于OPhone 2.0的2D动画实践(一) 基于OPhone 2.0的2D动画实践(一) OPhone平台开发, 2010-10-18 16:40:31 标签 : OPhone2.0 2D 动画     本系列文章主要介绍了OPhone 2.0 SDK提供的两种实现2D动画的方式.........
    ▪ google加长提供软件更新揭示        google加长提供软件更新提示 对于喜欢尝试最新软件功能的用户来说,手机上的软件应用也不会放过,只要软件商店提示有更新可用就会马上下载升级。不过有一些手机软件的版本升级会很频.........
    ▪ 贪食蛇项目开发有关问题2       贪食蛇项目开发问题2   基本都写好了,但是主类太多拥挤,因为一开始并没有规划好,用几个类,只是把整个游戏划为几个模块,并根据这几个模块进行开发,出来的结果就是把Game类太拥.........

[1]基于OPhone 2.0的2D卡通片实践(一)
    来源: 互联网  发布时间: 2014-02-18
基于OPhone 2.0的2D动画实践(一)
基于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文件,然后输入如下的内容:

view plaincopy to clipboardprint?
  •   <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对象。

    view plaincopy to clipboardprint?
  •   AnimationDrawable animationDrawable =   (AnimationDrawable)getResources().getDrawable(R.anim.test);  
  •   AnimationDrawable animationDrawable =   (AnimationDrawable)getResources().getDrawable(R.anim.test);


      在创建完AnimationDrawable对象后,可以使用下面的代码将AnimationDrawable对象作为ImageView组件的背景。

    view plaincopy to clipboardprint?
  •   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对象,代码如下:

    view plaincopy to clipboardprint?
  •   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文件的代码如下:

    view plaincopy to clipboardprint?
  •   <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个动画


      本例的完整代码如下:

    view plaincopy to clipboardprint?
  •   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开发速学宝典》。


        
    [2] google加长提供软件更新揭示
        来源: 互联网  发布时间: 2014-02-18
    google加长提供软件更新提示

    对于喜欢尝试最新软件功能的用户来说,手机上的软件应用也不会放过,只要软件商店提示有更新可用就会马上下载升级。不过有一些手机软件的版本升级会很频繁,每次升级都只是修改了小部分缺陷,这样的升级对于用户来说意义并不大。

    Google Android电子市场近日就修改了相关规则,让用户可以看到版本更新内容,然后根据情况选择下载。Android应用开发人员之前只能用325个字符来描述自己的软件功能,这基本没有写下版本升级明细的余地,现在Google修改了相关描述添加的规定,开发人员可以再写325个字符以内的版本更新细节。

    当用户在电子市场中选取一款软件后,在应用介绍内容的下面会新增一个升级说明区,用户可以看到最近升级的内容,从而自主选择是否进行下载。


        
    [3] 贪食蛇项目开发有关问题2
        来源: 互联网  发布时间: 2014-02-18
    贪食蛇项目开发问题2

      基本都写好了,但是主类太多拥挤,因为一开始并没有规划好,用几个类,只是把整个游戏划为几个模块,并根据这几个模块进行开发,出来的结果就是把Game类太拥挤。并没有把对象这个概念运用进去。

      解决方法,在开发前就应该对各个模块也进行细分,把各个功能进行分开成各个类,各个方法,各个变量。

     明天开始划分,重新开始写。。


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3