2.9 动画类的使用.doc_第1页
2.9 动画类的使用.doc_第2页
2.9 动画类的使用.doc_第3页
2.9 动画类的使用.doc_第4页
2.9 动画类的使用.doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android初级培训教材 2.9 动画类的使用 (理论9课时 实训8课时)目录9.1帧动画实现(1课时)3教学目标39.1.1 帧动画39.1.2 帧动画与AnimationDrawable39.1.3 代码69.1.4 示例代码99.1.5 实例-播放帧动画的子集99.1.6 示例代码119.2补间动画之AlphaAnimation的使用(1课时)12教学目标129.2.1补间动画(Tween)129.2.2动画创建步骤129.2.3透明度动画的使用139.2.4示例代码159.3补间动画之ScaleAnimation的使用(1课时)16教学目标169.3.1 XML和代码加载动画的区别169.3.2动画创建步骤169.3.3 ScaleAnimation的使用189.3.4示例代码219.4补间动画之TranslateAnimation的使用(1课时)21教学目标219.4.1动画的监听229.4.2动画创建步骤239.4.3 TranslateAnimation的使用249.4.4示例代码279.5补间动画之RotateAnimation的使用(1课时)27教学目标279.5.1动画创建步骤289.5.2 RotateAnimation的使用299.5.3示例代码329.6自定义动画的实现和动画的应用(2课时)32教学目标329.6.1自定义动画的实现思路339.6.2自定义动画的实现步339.6.3代码实现(动画类)339.6.4示例代码359.6.5动画应用实例359.6.6示例代码429.7布局动画的应用(1课时)42教学目标429.7.1布局动画的应用429.7.2布局动画的版本监测429.7.3代码示例429.7.4部分动画截图489.7.5示例代码509.1帧动画实现(1课时)教学目标帧动画实现。9.1.1 帧动画 如果读者使用过F1ash,一定对帧动画非常熟悉。帧动画实际上就是由若干图像组成的动画,这些图像会以一定的时间间隔进行切换。电影的原理也有些类似于帧动画。一般电影是每秒25帧,也就是说,电影在每秒钟之内会以相等的时间间隔连续播放25幅电影静态画面。由于人的视觉暂留,在这样的播放频率下,看起来电影才是连续的。在之前介绍过在onDraw方法中使用invalidate方法不断刷新View的方式来实现旋转动画。实际上这也相当于帧动画,只是并不是利用若干静态图像的不断切换来制作帧动画,而是不断地画出帧动画中的每一帧图像。9.1.2 帧动画与AnimationDrawable Android中的帧动画需要在一个动画文件中指定动画中的静态图像和每一张静态图像的停留时间(单位:毫秒)。一般可以将所有图像的停留时间设为同一个值。动画文件采用了XML格式,该文件需要放在resanim目录中。先来建立一个简单的动画文件,首先在resanim目录中建立一个frame_animation.xml文件,然后输入如下内容:从animxml文件的内容可以看出,一个标准的动画文件由一个标签和若干标签组成。其中标签的一个关键属性是android:oneshot,如果该属性值为true,表示帧动画只运行一遍,也就是从第一个图像切换到最后一个图像后,动画就会停止。如果该属性值为false,表示帧动画循环播放。 android:oneshot是可选属性,默认值是false. 标签的android:drawable属性指定了动画中的静态图像资源ID。帧动画的播放顺序就是标签的定义顺序。android:duration属性指定了每个图像的停留时间。在testxml文件中指定每个图像的停留时间为50毫秒。android:drawable和android:duration都是必选属性,不能省略。 编写完动画文件后,就需要装载动画文件,并创建AnimationDrawable对象。AnimationDrawable是Drawable的子类,并在Drawable的基础上提供了控制动画的功能。读者可以使用如下代码根据frame_animation.xml文件创建AnimationDrawable对象:animationDrawable2 = (AnimationDrawable)getResources().getDrawable(R.anim.frame_animation1);在创建完AnimationDrawable对象后,可以使用下面的代码将AnimationDrawable对象作为ImageViewivAnimView = (ImageView) findViewById(R.id.ivAnimView);/给ImageView设置背景图片ivAnimView.setBackgroundResource(R.anim.frame_animation);除了可以使用getDrawable方法装载frame_animation.anim文件外,还可以使用setBackgroundResource方法装载frame_animation.xml文件,并通过getBackground方法获得AnimationDrawable对象,代码如下:ivAnimView = (ImageView) findViewById(R.id.ivAnimView);/给ImageView设置背景图片ivAnimView.setBackgroundResource(R.anim.frame_animation);/得到ImageView的Drawable对象Object backgroundObject = ivAnimView.getBackground();/给animationDrawable赋值animationDrawable1 = (AnimationDrawable) backgroundObject;有了AnimationDrawable对象,就可以通过AnimationDrawable类的方法来控制帧动画。Animation-Drawable类中与帧动画相关的方法如下:start:开始播放帧动画。stop:停止播放帧动画。setOneShot:设置是否只播放一遍帧动画。该方法的参数值与动画文件中的标签的android:oneshot属性值的含义相同。参数值为true表示只播放一遍帧动画,参数值为false表示循环播放帧动画。默认值为false。addFrame:向AnimationDrawable对象中添加新的帧。该方法有两个参数,第1个参数是一个Drawable对象,表示添加的帧。该参数值可以是静态图像,也可以是另一个动画。第2个参数表示新添加帧的停留时间。如果新添加的帧是动画,那么这个停留时间就是新添加的动画可以播放的时间。如果到了停留时间,不管新添加的动画是否播放完,都会切换到下一个静态图像或动画。isOneShot:判断当前帧动画是否只播放一遍。该方法返回通过setOneShot方法或android:oneshot属性设置的值。isRunning:判断当前帧动画是否正在播放。如果返回true,表示帧动画正在播放。返回false表示帧动画已停止播放。getNumberOfFrames:返回动画的帧数,也就是标签中的标签数。getFrame:根据帧索引获得指定帧的Drawable对象。帧从O开始。getDuration:获得指定帧的停留时间。如果想显示半透明的帧动画,可以通过Drawable类的setAlpha方法设置图像的透明度,该方法只有一个int类型的值,该值的范围是0255。如果参数值是0,表示图像完全透明,如果参数值是255,表示图像完全不透明实例69:通过帧动画方式播放Gif动画Android SDK中播放GIF动画的类库可能会因为GIF文件版本的问题,并不能播放所有的GIF 动画文件,但可以采用帧动画的方式来播放GIF动画。 GIF动画文件本身由多个静态的GIF图像组成,因此可以使用图像处理软件(如FireWorks)将GIF动画文件分解成多个GIF静态图像。然后在resanim目录的动画文件中定义这些GIF文件。在本例中将一个GIF动画文件分解成16个GIF文件,并在resanimframe_animationxml文件中定义了这些GIF文件。Frame_animationxml文件的代码如下:为了演示在原有动画的基础上添加新的动画,本例引入了第二个GIF动画文件,并将这个GIF动画文件分解成12个GIF静态图.定义这12个GIF文件的动画文件是flame animation1xml。本例的功能包含“开始动画”“停止动画”、“运行一次动画”和“添加动画”,这4个功能分别对应于4个按钮。当单击【开始动画】按钮后,动画开始播放,如下图(左)所示。单击”增加动画”按钮,播放完第1个动画后,又会继续播放第2个动画,如下图(右)所示。在播放完第2个动画后,又会继续播放第1个动画图2.9-1帧动画实例效果图1 图2.9-2帧动画实例效果图29.1.3 代码public class Main extends Activity implements OnClickListenerprivate ImageView ivAnimView;private AnimationDrawable animationDrawable1;private AnimationDrawable animationDrawable2;private Button btnAddFrame;public void onClick(View view)switch (view.getId()case R.id.btnOneShot:/运行一次动画animationDrawable1.setOneShot(true);animationDrawable1.start();break;case R.id.btnStartAnim:/开始动画animationDrawable1.setOneShot(false);animationDrawable1.stop();animationDrawable1.start();break;case R.id.btnStopAnim:/停止动画animationDrawable1.stop();if (animationDrawable2 != null)animationDrawable2.stop();break;case R.id.btnAddFrame:/添加动画if (btnAddFrame.isEnabled()/按钮是可用状态/获取新增加动画的animationDrawable对象animationDrawable2 = (AnimationDrawable) getResources().getDrawable(R.anim.frame_animation1);/增加动画,动画停止(播放)时间2秒animationDrawable1.addFrame(animationDrawable2, 2000);btnAddFrame.setEnabled(false);break;Overridepublic 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);/给ImageView设置背景图片ivAnimView.setBackgroundResource(R.anim.frame_animation);/得到ImageView的Drawable对象Object backgroundObject = ivAnimView.getBackground();/给animationDrawable赋值animationDrawable1 = (AnimationDrawable) backgroundObject;/animationDrawable1.setAlpha(80);/addDrawable();在编写上面代码时应注意如下5点。setOneShot方法既可以在动画开始前设置,也可以在动画开始后设置。在开始动画之前,首先调用stop方法来停止动画。这是由于如果只播放一次动画,在播放完后,画面会停留在最后一个图像上。这时动画仍然是运行状态,也就是isRunning方法返回true。因此,必须在播放动画之前使用stop方法停止动画,否则必须先按一下【停止动画】按钮才可以。如果使用addFrame方法添加一个新动画,在停止原来动画时,并不会停止新添加的动画。也就是说,新添加的动画被看作一个整体,除非获得了新添加动画的AnimationDrawable对象(在本例中新添加动画的AnimationDrawable对象变量是animationDrawable 1),并调用该AnimationDrawable对象的stop方法停止动画。添加动画的播放时间受停留时间限制(addFrame方法的第2个参数值),即使到了停留时间,动画仍未播放完,也会切换到下一个动画或图像。如果停止了最初的动画,新添加的动画仍然会继续播放。读者可以将上面代码中switch语句的 RidbtnStopAnim分支中的代码的if语句注释掉,并添加动画。然后开始动画,最后停止动画。看看会有什么效果。如果读者想播放半透明的动画,可以使用setAlpha方法,例如下面的代码将动画图像的透明度设为80。animationDrawablesetAlpha(80);图2.9-3帧动画实例效果图39.1.4 示例代码请参阅demo/animation_01代码示例9.1.5 实例-播放帧动画的子集本例将播放帧动画中指定的部分图像,也就是帧动画的子集。虽然AnimationDrawable类提供了getFrame和getDuration方法可以获得指定帧的Drawable对象和停留时间,但并未提供获得帧动画当前播放位置的方法。在查看AnimationDrawable类的源代码后发现,在AnimationDrawable类中有一个mCurFrame变量,该变量是int类型,保存当前动画的播放位置。但mCurFrame是私有(private)变量,无法通过正常方式在其他类中访问该变量。虽然通过正常方式无法访问该变量,但仍然可以通过Java反射技术来读写private变量,代码如下:要注意的是,虽然可以使用getDeclaredField方法获得mCurFrame变量的Field对象,但由于mCurFrame是private变量,默认情况下无法直接通过Field对象获得和设置mCurFrame变量的值,因此需要通过setAccessible方法将Field对象设置成可访问状态。由于AnimationDrawable类并未提供监听每帧动画播放状态的事件,因此,要编写一个ImageView的子类(MylmageView),并覆盖onDraw方法来监听每帧动画播放的状态。当每一帧动画刚开始播放时会刷新ImageView,也就是会调用onDraw方法。MylmageView类的代码如下:public class MyImageView extends ImageViewpublic AnimationDrawable animationDrawable;public Field field;public TextView textView;Overrideprotected void onDraw(Canvas canvas)tryfield = AnimationDrawable.class.getDeclaredField(mCurFrame);/将mCurFrame变量设置为可访问状态field.setAccessible(true);/获得mCurFrame变量的值int curFrame = field.getInt(animationDrawable);/当播放第3帧后,将从第1帧开始重播textView.setText(第+(curFrame+1)+帧);if (curFrame = 4)/将当前帧设置为0,页就是是从第1帧开始播放field.setInt(animationDrawable, 0);Toast.makeText(this.getContext(), 重新设为第一个图像., Toast.LENGTH_SHORT).show(); catch (Exception e)super.onDraw(canvas);public MyImageView(Context context, AttributeSet attrs)super(context, attrs);在设置XML布局文件时应该使用MyImageView组件来显示动画,代码如下:使用MyImageView对象之前需要MyImageView类的animationDrawable对象,本例还使用了getNumberOfFrames方法将动画帧的总数显示出来public void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);MyImageView ivAnimView = (MyImageView) findViewById(R.id.ivAnimView);TextView textView = (TextView) findViewById(R.id.textView1);ivAnimView.textView=textView;ivAnimView.setBackgroundResource(R.anim.frame_animation);ivAnimView.setOnClickListener(new OnClickListener()Overridepublic void onClick(View arg0)animationDrawable.stop();animationDrawable.start(););Object backgroundObject = ivAnimView.getBackground();animationDrawable = (AnimationDrawable) backgroundObject;ivAnimView.animationDrawable = animationDrawable;setTitle(getTitle() + );虽然动画有6帧,但本例通过对mCurframe的控制只显示前4帧.运行本例后,单击图片会开始动画.每页显示到第4帧时,会显示一个Toast信息框,如下图:图2.9-4帧动画实例效果图49.1.6 示例代码请参阅demo/animation_02代码示例9.2补间动画之AlphaAnimation的使用(1课时)教学目标补间动画之AlphaAnimation的使用9.2.1补间动画(Tween)如果动画中的图片变化比较有规律,可以采用自动生成中间图像的方式来生成动画,例如图像的移动,旋转,缩放等。当然,还用更复杂的情况,例如由正方形变成圆形,圆形变成椭圆形,这些变化过程中的图像都可以根据一定的数学算法自动生成。我们只需要指定动画的第一帧到最后一帧的图像即可。这中自动生成中间图像的动画被称为补间动画。补间动画的优点是节省硬盘空间,这是因为这种动画只需要提供两个帧图像(第一帧和最后一帧),其他的图像都由系统自动生成。当然这种动画也有一定的缺点,就是动画很复杂时无法自动生成中间的图像,例如由电影画面组成的动画,由于每幅画面过于复杂,系统无法预料下一幅画面是什么样子。因此这种复杂的动画只能使用帧动画来完成。本章将介绍Android SDk提供的4种补间动画效果:移动,缩放,旋转和透明度。9.2.2动画创建步骤 在代码中的实现1. 创建一个AnimationSet对象;/创建动画集合AnimationSet animationSet=new AnimationSet(true);2. 根据需要创建相应的Animation对象/设置透明度AlphaAnimation alpha1 = new AlphaAnimation(0.01f, 1.0f);3. 根据软件的动画的需求,为Animation对象设置相应的数据/设置持续的时间alpha1.setDuration(long) (10 * 1000);4. 将Animation对象增加到AnimationSet对象当中/将透明度动画加到动画集合中animationSet.addAnimation(alpha1);5. 使用空间对象开始执行AnimationSet,启动动画/启动动画imageView.startAnimation(animationSet); XML代码中的实现1. 在项目中的res目录下创建一个新的文件夹anim,用于放置动画的xml,并创建xml文件图2.9-5 动画xml文件结构图2. 编辑xml文件,如下3. 在代码中加载动画xml文件 /加载动画布局文件Animation myAnimation=AnimationUtils.loadAnimation(this,R.anim.my_alpha) ;4. 启动动画 /启动动画imageView.startAnimation(myAnimation);9.2.3透明度动画的使用 通过xml加载透明动画 在代码中调用/*设置动画(XML) * param imageView * author Fan Chenggong */void initAnimation2(ImageView imageView)/加载动画布局文件Animation myAnimation= AnimationUtils.loadAnimation(this,R.anim.my_alpha);/启动动画imageView.startAnimation(myAnimation); 代码中实现透明动画/*设置动画(代码) * param imageView * author Fan Chenggong */void initAnimation1(ImageView imageView)/创建动画集合AnimationSet animationSet=new AnimationSet(true);/设置透明度AlphaAnimation alpha1 = new AlphaAnimation(0.01f, 1.0f);/设置持续的时间alpha1.setDuration(long) (10 * 1000);/将透明度动画加到动画集合中animationSet.addAnimation(alpha1);/启动动画imageView.startAnimation(animationSet);图2.9-6 补间动画之AlphaAnimation实例效果图19.2.4示例代码请参阅demo/2.9_Animation_Alpha代码示例9.3补间动画之ScaleAnimation的使用(1课时)教学目标补间动画之ScaleAnimation的使用9.3.1 XML和代码加载动画的区别用代码设置动画,其设置繁琐,会大大降低代码的可行性(相对而言),采用XML加载复杂的动画特效,更加直观,大大提高代码的可读性,但是在我们开发动画特效时,常常会给据自己的需要来选择用两个中的一种来加载动画,并不是说一定要使用哪种。一般动画过于单一的话选择代码加载动画比较方便。比较复杂的动画选择XML加载动画可读性更高。9.3.2动画创建步骤 在代码中的实现1. 创建一个AnimationSet对象;/创建动画集合AnimationSet animationSet=new AnimationSet(true);2. 根据需要创建相应的Animation对象/设置缩放动画ScaleAnimation Scale1 = new ScaleAnimation(0.01f, 1, 0.01f, 1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);3. 根据软件的动画的需求,为Animation对象设置相应的数据/设置持续的时间Scale1.setDuration(long) (10 * 1000);4. 将Animation对象增加到AnimationSet对象当中/将缩放动画加到动画集合中animationSet.addAnimation(Scale1);5. 使用空间对象开始执行AnimationSet,启动动画/启动动画imageView.startAnimation(animationSet); XML代码中的实现1. 在项目中的res目录下创建一个新的文件夹anim,用于放置动画的xml,并创建xml文件图2.9-7动画xml文件结构图2. 编辑xml文件,如下3. 在代码中加载动画xml文件/加载动画布局文件Animation myAnimation=AnimationUtils.loadAnimation(this,R.anim.my_scale); 4. 启动动画/启动动画imageView.startAnimation(myAnimation);9.3.3 ScaleAnimation的使用 通过xml加载动画在代码中调用/*设置动画(XML) * param imageView * author Fan Chenggon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论