原文:http://blog.csdn.net/feng88724/article/details/6318430

Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。

第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。

下面就讲一下Tweene Animations。

主要类:

Animation   动画

AlphaAnimation 渐变透明度

RotateAnimation 画面旋转

ScaleAnimation 渐变尺寸缩放

TranslateAnimation 位置移动

AnimationSet  动画集

有了这些类,那么我们如何来实现动画效果呢?

以自定义View为例,该View很简单,画面上只有一个图片。 现在我们要对整个View分别实现各种Tween动画效果。

AlphaAnimation

通过代码实现 AlphaAnimation,如下:

  1. //初始化
  2. Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
  3. //设置动画时间            alphaAnimation.setDuration(3000);
  4. this.startAnimation(alphaAnimation);

其中AlphaAnimation类第一个参数fromAlpha表示动画起始时的透明度, 第二个参数toAlpha表示动画结束时的透明度。

setDuration用来设置动画持续时间。

RotateAnimation

 

代码:

  1. Animation rotateAnimation = new RotateAnimation(0f, 360f);
  2. rotateAnimation.setDuration(1000);
  3. this.startAnimation(rotateAnimation);

其中RotateAnimation类第一个参数fromDegrees表示动画起始时的角度, 第二个参数toDegrees表示动画结束时的角度。

另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。

ScaleAnimation

代码:

  1. //初始化
  2. Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);
  3. //设置动画时间
  4. scaleAnimation.setDuration(500);
  5. this.startAnimation(scaleAnimation);

ScaleAnimation类中

第一个参数fromX ,第二个参数toX:分别是动画起始、结束时X坐标上的伸缩尺寸。

第三个参数fromY ,第四个参数toY:分别是动画起始、结束时Y坐标上的伸缩尺寸。

另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。

TranslateAnimation

代码:

  1. //初始化
  2. Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
  3. //设置动画时间                translateAnimation.setDuration(1000);
  4. this.startAnimation(translateAnimation);

TranslateAnimation类

第一个参数fromXDelta ,第二个参数toXDelta:分别是动画起始、结束时X坐标。

第三个参数fromYDelta ,第四个参数toYDelta:分别是动画起始、结束时Y坐标。

参数详细说明:

表二

XML节点 功能说明
alpha 渐变透明度动画效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
toAlpha 属性为动画结束时透明度

表三

scale 渐变尺寸伸缩动画效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float] 为动画起始时,X、Y坐标上的伸缩尺寸 0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toXScale [float]
toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float]
pivotY[float]
为动画相对于物件的X、Y坐标的开始位置 属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
       

表四

translate 画面转换位置移动动画效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
为动画、结束起始时 X坐标上的位置  
fromYDelta
toYDelta
为动画、结束起始时 Y坐标上的位置  
       

表五

rotate 画面转移旋转动画效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY
为动画相对于物件的X、Y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
       

以上都是单独的使用某个动画,那么如何让多个动画同时生效呢?

 

答案是 AnimationSet。

初看整个类名,还以为只是用来存放 Animation的一个Set, 细看才发现,该类也是继承自 Animation的。

下面我们实现一个动画,该动画会让图片移动的同时,图片透明度渐变,直接看代码吧。

  1. //初始化 Translate动画
  2. translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
  3. //初始化 Alpha动画
  4. alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
  5. //动画集
  6. AnimationSet set = new AnimationSet(true);
  7. set.addAnimation(translateAnimation);
  8. set.addAnimation(alphaAnimation);
  9. //设置动画时间 (作用到每个动画)
  10. set.setDuration(1000);
  11. this.startAnimation(set);

是不是觉得很简单呢?

附上整个View类的代码吧。

  1. package com.yfz.view;
  2. import com.yfz.R;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.drawable.BitmapDrawable;
  6. import android.util.Log;
  7. import android.view.KeyEvent;
  8. import android.view.View;
  9. import android.view.animation.AlphaAnimation;
  10. import android.view.animation.Animation;
  11. import android.view.animation.AnimationSet;
  12. import android.view.animation.RotateAnimation;
  13. import android.view.animation.ScaleAnimation;
  14. import android.view.animation.TranslateAnimation;
  15. public class TweenAnim extends View {
  16. //Alpha动画 - 渐变透明度
  17. private Animation alphaAnimation = null;
  18. //Sacle动画 - 渐变尺寸缩放
  19. private Animation scaleAnimation = null;
  20. //Translate动画 - 位置移动
  21. private Animation translateAnimation = null;
  22. //Rotate动画 - 画面旋转
  23. private Animation rotateAnimation = null;
  24. public TweenAnim(Context context) {
  25. super(context);
  26. }
  27. @Override
  28. protected void onDraw(Canvas canvas) {
  29. super.onDraw(canvas);
  30. Log.e("Tween", "onDraw");
  31. //加载一个图片
  32. canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(), 0, 0, null);
  33. }
  34. @Override
  35. public boolean onKeyDown(int keyCode, KeyEvent event) {
  36. Log.e("Tween", "onKeyDown");
  37. return true;
  38. }
  39. @Override
  40. public boolean onKeyUp(int keyCode, KeyEvent event) {
  41. Log.e("Tween", "onKeyDown");
  42. switch (keyCode) {
  43. case KeyEvent.KEYCODE_DPAD_UP:
  44. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_UP");
  45. alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
  46. //设置动画时间
  47. alphaAnimation.setDuration(3000);
  48. this.startAnimation(alphaAnimation);
  49. break;
  50. case KeyEvent.KEYCODE_DPAD_DOWN:
  51. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");
  52. rotateAnimation = new RotateAnimation(0f, 360f);
  53. rotateAnimation.setDuration(1000);
  54. this.startAnimation(rotateAnimation);
  55. break;
  56. case KeyEvent.KEYCODE_DPAD_LEFT:
  57. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");
  58. //初始化
  59. scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);
  60. //设置动画时间
  61. scaleAnimation.setDuration(500);
  62. this.startAnimation(scaleAnimation);
  63. break;
  64. case KeyEvent.KEYCODE_DPAD_RIGHT:
  65. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");
  66. //初始化
  67. translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
  68. //设置动画时间
  69. translateAnimation.setDuration(1000);
  70. this.startAnimation(translateAnimation);
  71. break;
  72. case KeyEvent.KEYCODE_DPAD_CENTER:
  73. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_CENTER");
  74. //初始化 Translate动画
  75. translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);
  76. //初始化 Alpha动画
  77. alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
  78. //动画集
  79. AnimationSet set = new AnimationSet(true);
  80. set.addAnimation(translateAnimation);
  81. set.addAnimation(alphaAnimation);
  82. //设置动画时间 (作用到每个动画)
  83. set.setDuration(1000);
  84. this.startAnimation(set);
  85. break;
  86. default:
  87. break;
  88. }
  89. return true;
  90. }
  91. }

在Activity中调用该类时,需要注意一定setFocusable(true), 否则焦点在Activity上的话,onKeyUp方法是不会生效的。

调用该View的代码:

  1. TweenAnim anim = new TweenAnim(Lesson_11.this);
  2. anim.setFocusable(true);
  3. setContentView(anim);

上面通过Java代码,实现了4中不同的Tween动画,其实在Android中完全可以通过 XML文件来实现动画。这种方式可能更加简洁、清晰,也更利于重用。

下面我们分别对这几种动画改用xml来实现。

首先是AlphaAnimation。

alpha_anim.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <alpha  
  4.         android:fromAlpha="0.1"  
  5.         android:toAlpha="1.0"  
  6.         android:duration="2000"  
  7.     />  
  8. </set>  

 

不用解释了吧。

RotateAnimation

rotate_anim.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <rotate
  4. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  5. android:fromDegrees="0"
  6. android:toDegrees="360"
  7. android:pivotX="50%"
  8. android:pivotY="50%"
  9. android:duration="500"
  10. />
  11. </set>

ScaleAnimation

scale_anim.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <scale
  4. android:interpolator="@android:anim/accelerate_decelerate_interpolator"
  5. android:fromXScale="0.0"
  6. android:toXScale="1.0"
  7. android:fromYScale="0.0"
  8. android:toYScale="1.0"
  9. android:pivotX="50%"
  10. android:pivotY="50%"
  11. android:fillAfter="false"
  12. android:duration="500"
  13. />
  14. </set>

TranslateAnimation

translate_anim.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:fromXDelta="10"
  5. android:toXDelta="100"
  6. android:fromYDelta="10"
  7. android:toYDelta="100"
  8. />
  9. </set>

布局文件都已经写完,那么如何来使用这些文件呢?

其实也很简单,此时需要用到AnimationUtils类。 通过该类中 loadAnimation 方法来加载这些布局文件。

如:

  1. rotateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_anim);

这次View类的代码如下:

  1. package com.yfz.view;
  2. import com.yfz.R;
  3. import android.content.Context;
  4. import android.graphics.Canvas;
  5. import android.graphics.drawable.BitmapDrawable;
  6. import android.util.Log;
  7. import android.view.KeyEvent;
  8. import android.view.View;
  9. import android.view.animation.AlphaAnimation;
  10. import android.view.animation.Animation;
  11. import android.view.animation.AnimationSet;
  12. import android.view.animation.AnimationUtils;
  13. import android.view.animation.RotateAnimation;
  14. import android.view.animation.ScaleAnimation;
  15. import android.view.animation.TranslateAnimation;
  16. public class TweenAnim2 extends View {
  17. //Alpha动画 - 渐变透明度
  18. private Animation alphaAnimation = null;
  19. //Sacle动画 - 渐变尺寸缩放
  20. private Animation scaleAnimation = null;
  21. //Translate动画 - 位置移动
  22. private Animation translateAnimation = null;
  23. //Rotate动画 - 画面旋转
  24. private Animation rotateAnimation = null;
  25. public TweenAnim2(Context context) {
  26. super(context);
  27. }
  28. @Override
  29. protected void onDraw(Canvas canvas) {
  30. super.onDraw(canvas);
  31. Log.e("Tween", "onDraw");
  32. //加载一个图片
  33. canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(), 0, 0, null);
  34. }
  35. @Override
  36. public boolean onKeyDown(int keyCode, KeyEvent event) {
  37. Log.e("Tween", "onKeyDown");
  38. return true;
  39. }
  40. @Override
  41. public boolean onKeyUp(int keyCode, KeyEvent event) {
  42. Log.e("Tween", "onKeyDown");
  43. switch (keyCode) {
  44. case KeyEvent.KEYCODE_DPAD_UP:
  45. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_UP");
  46. alphaAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);
  47. this.startAnimation(alphaAnimation);
  48. break;
  49. case KeyEvent.KEYCODE_DPAD_DOWN:
  50. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");
  51. rotateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_anim);
  52. this.startAnimation(rotateAnimation);
  53. break;
  54. case KeyEvent.KEYCODE_DPAD_LEFT:
  55. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");
  56. scaleAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.scale_anim);
  57. this.startAnimation(scaleAnimation);
  58. break;
  59. case KeyEvent.KEYCODE_DPAD_RIGHT:
  60. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");
  61. translateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.translate_anim);
  62. this.startAnimation(translateAnimation);
  63. break;
  64. case KeyEvent.KEYCODE_DPAD_CENTER:
  65. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_CENTER");
  66. //初始化 Translate动画
  67. translateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.translate_anim);
  68. //初始化 Alpha动画
  69. alphaAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);
  70. //动画集
  71. AnimationSet set = new AnimationSet(true);
  72. set.addAnimation(translateAnimation);
  73. set.addAnimation(alphaAnimation);
  74. //设置动画时间 (作用到每个动画)
  75. set.setDuration(1000);
  76. this.startAnimation(set);
  77. break;
  78. default:
  79. break;
  80. }
  81. return true;
  82. }
  83. }

好了,本次就这么多。

参考: http://www.moandroid.com/?p=790

【转】android动画之Tween动画 (渐变、缩放、位移、旋转)的更多相关文章

  1. Android学习笔记-tween动画之java实现

    Android动画分为Tween动画和Frame动画,近期学习了,体tween动画,现在讲学习的心得以及相关知识介绍如下. Tween又称为补间动画,可以把对象进行缩小.放大.旋转和渐变等操作.   ...

  2. Android动画之Tween动画实战

    Android动画分为Tween动画和Frame动画,上一节通过一个实例介绍了Frame动画,本节将介绍Tween动画.Tween可以把对象进行缩小.放大.旋转和渐变等操作.     Tween动画有 ...

  3. Android学习笔记-tween动画之xml实现

    继上篇tween动画的java实现:http://www.cnblogs.com/fengtengfei/p/3957800.html, 这里我接着介绍一下tween动画的xml实现的方法,   首先 ...

  4. 关于Unity中NGUI的帧动画和Tween动画

    帧动画 1.把三张帧动画的贴图png制作成图集,NGUI---->Open---->Atlas Maker,生成一个预制体,一个材质球,一个大图 2.创建一个Sprite类型的Sprite ...

  5. Android tween 动画 XML 梳理

    前言: Tween动画是展现出旋转.渐变.移动.缩放的这么一种转换过程,即补间动画.Tween动画有两种定义方式:XML形式,编码形式.这次主要来梳理XML的方式配置动画 (1)XML定义动画,按照动 ...

  6. Android动画及图片的缩放和旋转

    Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说Tween动画吧. Tween动画是对视图对象中的内容进行一系列简单的转换,比如位置的移动 ...

  7. android之tween动画详解

    android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可 ...

  8. 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变). 第二类就是 Frame动画,即顺序的播放事先做好的图像,与g ...

  9. Android学习笔记_55_Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变).第二类就是 Frame动画,即顺序的播放事先做好的图像,与gi ...

随机推荐

  1. 王立平--android特权

    //同意应用程序访问和更改checkin数据库"properties"数据表 android.permission.ACCESS_CHECKIN_PROPERTIES //同意应用 ...

  2. Linux下is not in the sudoers file(转)

    用sudo时提示"xxx is not in the sudoers file. This incident will be reported.其中XXX是你的用户名,也就是你的用户名没有权 ...

  3. Signed comparison in Verilog

    Signed comparison in Verilog¶ When you write this in Verilog: wire [7:0] a; wire [7:0] b; wire less; ...

  4. python有些错误换行问题解决

    有时候数据会遇到一些错误包.例如,正确的数据应: 20141010,aaa,bbb,ccc,ddd,eee 但实际的数据是来: 20141010,aaa,bbb, ccc,ddd, eee 这样出现错 ...

  5. Writing your first Django app, part 1(转)

    Let’s learn by example. Throughout this tutorial, we’ll walk you through the creation of a basic pol ...

  6. java基金会成立

    在java在,数据收集的操作,应使用非常.最近看了零星收集的小知识,在这里,一点点排序. 它基本上是四个常用的类操作点总结集合. 首先.集合大致分为两个方向.一种是普通的集合类型,通过接口collec ...

  7. Oracle使用并行索引需要注意的问题

    当索引的结构.我们要建立索引快.它将并行加,加平行后.这将平行的列索引. 当并行度索引访问,CBO你可能会考虑并行运行,这可能会导致一些问题.作为server候用并行会引起更加严重的争用.当使用并行后 ...

  8. MSMQ-发送消息到远程专用队列 实例

    目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子   一. ...

  9. Linux而不必进入password登陆自己主动sshserver方法

    使用OpenSSH在linux通过登陆sshserver时间,系统会提示您输入每次password,和用途vim 的netrw保存编辑后的每一个变化必须失去远程文件时,插件password,很多麻烦. ...

  10. 使用 Eclipse 的 SVN 主要插件创建项目/支/标签

    原文 阅读 Mark Phippard 该博客以及<Subversion 与版本号控制>之后,我了解到 分支/标签 是 SVN 非常棒的特性之中的一个.但我在使用推荐的 "tru ...