zoukankan      html  css  js  c++  java
  • 安卓突击: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
































  • 相关阅读:
    【465】词干提取与词形还原
    【464】文本转字符向量bag of words
    【462】淘宝个人简介
    Docker 图形化页面管理工具使用
    Docker 简介与shell操作使用
    Spring Boot 入门案例与配置说明
    项目管理工具Maven的安装与使用
    Git(五)IDEA应用Git
    Git(四)Git的分支管理
    Git(三)Git的远程仓库
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4745820.html
Copyright © 2011-2022 走看看