安卓突击:Android 动画有哪几种?

Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;

Frame Animation:顺序播放事先做好的图像,是一种画面转换动画。

一 Tween Animation

 Tween Animation有四种形式:

  l  alpha              渐变透明度动画效果

  l  scale                渐变尺寸伸缩动画效果

  l  translate            画面位置移动动画效果

  l  rotate                 画面旋转动画效果

这四种动画实现方式都是通过Animation类和AnimationUtils配合实现。

可以通过xml实现:动画的XML文件在工程中res/anim目录。

例如:rotate.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:fillAfter = "false"
  4. android:zAdjustment="bottom"
  5. >
  6. <rotate
  7. android:fromDegrees="0"
  8. android:toDegrees="360"
  9. android:pivotX="50%"
  10. android:pivotY="50%"
  11. android:duration="4000"
  12. />
  13. </set>

实现动画:

  1. Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.rotate);
  2. //监听动画的状态(开始,结束)
  3. anim.setAnimationListener(new EffectAnimationListener());
  4. textWidget = (TextView)findViewById(R.id.text_widget);
  5. textWidget.setText(" 画面转移旋转动画效果");
  6. textWidget.startAnimation(anim);

二 Frame Animation

  Frame Animation是顺序播放事先做好的图像,跟电影类似。不同于animation package,

Android SDK提供了另外一个类AnimationDrawable来定义使用Frame Animation。

利用xml文件实现:res/drawable-hdpi/frame.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <animation-list
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:oneshot="true"
  5. >
  6. <item android:drawable="@drawable/p1" android:duration="1000"></item>
  7. <item android:drawable="@drawable/p2" android:duration="1000"></item>
  8. <item android:drawable="@drawable/p3" android:duration="1000"></item>
  9. <item android:drawable="@drawable/p4" android:duration="1000"></item>
  10. <item android:drawable="@drawable/p5" android:duration="1000"></item>
  11. <item android:drawable="@drawable/p6" android:duration="1000"></item>
  12. </animation-list>

实现动画:

  1. AnimationDrawable anim = (AnimationDrawable)getResources().
  2. getDrawable(R.drawable.frame);
  3. CustomAnimDrawable cusAnim = new CustomAnimDrawable(anim);
  4. cusAnim.setAnimationListener(new FrameAnimationListener());
  5. textWidget = (TextView)findViewById(R.id.text_widget);
  6. textWidget.setText(" 画面逐帧动画效果");
  7. textWidget.setBackgroundDrawable(anim);
  8. cusAnim.start();

这里有点不同的是,利用AnimationDrawable实现动画时,本身并没有提供接口来监听动画的状态(开始,结束),

这里我自己简单实现了一个方法来判断动画的状态。CustomAnimDrawable是自己写的继承于AnimationDrawable的

一个类,用来根据播放第几帧来判断,避免了根据时间来判断时,理论时间和实际时间不一致造成的影响。

  用到了Java的反射机制。

CustomAnimDrawable实现:

  1. public class CustomAnimDrawable extends AnimationDrawable {
  2. private final String TAG = "xmp";
  3. private AnimationDrawable mOriAnim;
  4. private AnimationDrawable mSelf;
  5. private Handler mHandler;
  6. private boolean mStarted;
  7. private AnimEndListenerRunnable mEndRunnable;
  8. private AnimationDrawableListener mListener;
  9. public CustomAnimDrawable(AnimationDrawable anim) {
  10. mOriAnim = anim;
  11. initialize();
  12. }
  13. private void initialize() {
  14. mSelf = this;
  15. mStarted = false;
  16. mHandler = new Handler();
  17. mEndRunnable = new AnimEndListenerRunnable();
  18. for (int i = 0; i < mOriAnim.getNumberOfFrames(); i++) {
  19. mSelf.addFrame(mOriAnim.getFrame(i), mOriAnim.getDuration(i));
  20. }
  21. }
  22. @Override
  23. public void start() {
  24. mOriAnim.start();
  25. mStarted = true;
  26. mHandler.post(mEndRunnable);
  27. if (mListener != null) {
  28. mListener.onAnimationStart(mSelf);
  29. }
  30. Log.v(TAG, "------CustomAnimDrawable------>start");
  31. }
  32. /**
  33. * 循环检测 动画的状态
  34. */
  35. class AnimEndListenerRunnable implements Runnable {
  36. @Override
  37. public void run() {
  38. // 动画已开始
  39. if (!mStarted) {
  40. return;
  41. }
  42. // 未停止继续监听
  43. if (!isEnd()) {
  44.           //这里的延迟时间是跟你的每一帧动画时间有关,基本保持一致就可以,最后一帧也会完整播放
  45.           //上面动画时间为每一帧1000ms,所以这里设为了1000ms
  46. mHandler.postDelayed(mEndRunnable,1000);
  47. return;
  48. }
  49. Log.v(TAG, "----------->over");
  50. // 动画已结束
  51. if (mListener != null) {
  52. mStarted = false;
  53. mListener.onAnimationEnd(mSelf);
  54. }
  55. }
  56. }
  57. /**
  58. * 判断动画是否结束 采用反射机制
  59. * @return
  60. */
  61. private boolean isEnd(){
  62. Class<AnimationDrawable> animClass = AnimationDrawable.class;
  63. try{
  64. //利用Java反射方法判断是否结束
  65. //获得私有方法 例如
  66. //Method method = animClass.getDeclaredMethod("nextFrame",boolean.class);
  67. //访问其私有变量
  68. Field field = animClass.getDeclaredField("mCurFrame");
  69. field.setAccessible(true);
  70. int currFrameNum = field.getInt(mOriAnim);
  71. int totalFrameNum = mOriAnim.getNumberOfFrames();
  72. if((currFrameNum == totalFrameNum - 1)||
  73. (currFrameNum == -1)){
  74. return true;
  75. }
  76. }
  77. catch (Exception e) {
  78. Log.v(TAG,"-------->Exception");
  79. }
  80. return false;
  81. }
  82. public void setAnimationListener(AnimationDrawableListener listener) {
  83. mListener = listener;
  84. }
  85. public interface AnimationDrawableListener {
  86. /**
  87. * Notifies the start of the animation
  88. * @param animation
  89. */
  90. public void onAnimationStart(AnimationDrawable animation);
  91. /**
  92. * Notifies the end of the animation
  93. * @param animation
  94. */
  95. public void onAnimationEnd(AnimationDrawable animation);
  96. }
  97. }

代码下载地址: http://files.cnblogs.com/bastard/animationTest.rar

来自为知笔记(Wiz)

时间: 2024-11-05 18:23:46

安卓突击:Android 动画有哪几种?的相关文章

Android动画Animation的两种加载执行方式

本文以简单的AlphaAnimation("淡入淡出(透明度改变)"动画)为例,简单的说明Android动画Animation的两种加载执行方法: (1) 直接写Java代码,制作Android动画. (2) 写XML配置文件,加载XML资源文件执行. 其实这两者是一致的.要知道,在Android中,凡是可以在XML文件完成的View,代码亦可完全写出来. 现在先给出一个Java代码完成的动画AlphaAnimation,AlphaAnimation功能简单,简言之,可以让一个View

Android 动画详解

这次主要就介绍android动画,android动画目前分为三种形式,Tween Animation 这个只能应用于view对象上面的,Drawable Animation这个是帧动画,就是类似我们有一些列的图片依次播放图片时出现的动画,Property Animation 这个是属性动画,这也是在android3.0之后引进的动画,在手机的版本上是android4.0就可以使用这个动画,下面我们主要就是针对这三种情况进行介绍. Tween Animation 这个动画在Property Ani

Android动画深入分析

动画分类 Android动画可以分3种:View动画,帧动画和属性动画:属性动画为API11的新特性,在低版本是无法直接使用属性动画的,但可以用nineoldAndroids来实现(但是本质还是viiew动画).学习本篇内容主要掌握以下知识: 1,View动画以及自定义View动画.2,View动画的一些特殊使用场景.3,对属性动画做了一个全面的介绍.4,使用动画的一些注意事项. view动画 View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation(平

Android动画之:Frame动画

Frame动画是Android动画中的一种 ,类似于我们看电影一样,动画是由N张图片组成的,在地一的时间内轮流显示图片实现动画现象.实现Frame动画也有两种方式,一种在xml中写动画布局,另外一种是纯代码实现 . 先看下Frame动画的xml布局方法: <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.

Android动画合集大全(上百种动画)

Android动画合集大全(上百种动画) 本项目是一套基于安卓的动画集合大全项目源码,包括但不限于各种程序Splash启动引导动画.高仿动画效果.ListView集合.自定义控件集合.页面滑动集合.折叠效果集合和一些比较精彩的动画例如:淘宝菜单.火车票出票动画.优酷导航菜单.图片3D浏览.扫雷效果和其他简单复杂动画,总共可以达到上百个,还在不断更新.再加上本人平时收集的源码demo库可以说是很强大的存在了项目源码下载地址和本人收集的源码库 下载地址:http://www.devstore.cn/

Android动画的两种使用方式。

android 动画的分类就不说了,主要说一下动画的两种使用方法:1.通过代码生成并使用动画 (不利于重复使用) 2.通过xml文件生成并使用动画(更方便,重用性高). 1.通过代码生成动画 ? 1 2 3 4 5 //初始化 Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f); //设置动画时间 scaleAnimation.setDuration(500); this.startAnimation(scale

安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)

安卓(android)建立项目时失败.出现AndroidManifest.xml file missing几种解决方法?(总结中) Eclipse新建项目.遇到这种问题.注意例如以下: 1.文件名称最好不要用中文. 2.文件夹也不要用中文. 3.这个不会出错,但出于程序编写习惯.第一个字母最好为大写.

安卓开发_浅谈Android动画(四)

Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属性动画类 方法 描述 setDuration(long duration) 设置动画持续时间的方法 setEvaluator(TypeEvaluator value) 设置插值计算的类型 setInterpolator(TimeInterpolator value) 设置时间插值器的类型 addUp

Android动画知识汇总

本文是对Android动画的汇总.关于Android的动画包括 3.0之前的View Animation,3.0之后的 Property Animator 以及5.0新增的(Touch feedback(触摸反馈)Reveal effect(揭露效果)Activity transitions(Activity转换效果)Curved motion(曲线运动)View state changes (视图状态改变)Animate Vector Drawables(可绘矢量动画))6种动画. 几种动画的