码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-08-20 18:48:21      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

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
































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

标签:

原文地址:http://www.cnblogs.com/zhuzhenfeng/p/4745820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!