• Android学习笔记15:Frame Animation动画的实现


      在Android中,动画Animation的实现有两种方式:Tween Animation(渐变动画)和Frame Animation(帧动画)。渐变动画是通过对场景里的对象不断做图像变换(平移、缩放、旋转等)产生动画效果。帧动画则是通过顺序播放事先准备好的图像来产生动画效果,和电影类似。

      帧动画主要是通过AnimationDrawable类来实现的。

    1.AnimationDrawable类

      AnimationDrawable类用于创建由一系列Drawable对象构成的逐帧动画对象,它可以作为一个视图对象的背景。

      AnimationDrawable类的常用方法有以下一些:

    mAnimationDrawable.addFrame(Drawable frame, int duration);//添加一个帧动画

    mAnimationDrawable.getDuration(int i);//获得帧动画的时间

    mAnimationDrawable.getFrame(int index);//获得指定索引的Drawable对象

    mAnimationDrawable.getNumberOfFrames();//获得帧动画的总数

    mAnimationDrawable.isOneShot();//帧动画是否只运行一次

    mAnimationDrawable.isRunning();//帧动画是否处于运行状态

    mAnimationDrawable.setOneShot(boolean onsShot);//设置帧动画是否只运行一次

    mAnimationDrawable.setVisible(boolean visible, boolean restart);//设置帧动画是否可见

    mAnimationDrawable.start();//运行帧动画

    mAnimationDrawable.stop();//停止帧动画

     

    2.通过Java代码实现Frame Animation动画

      要实现Frame Animation动画,需要创建一个AnimationDrawable对象来表示Frame动画,然后通过addFrame()方法把每一帧要显示的内容添加进去,最后通过start()方法就可以播放动画了。

      setOneShot()方法可以设置动画是否需要重复播放。

      在具体实现中,需要预先准备了15张单帧动画图像,分别命名为image1到image15,并存放在工程的res/drawable目录下。然后可以通过如下方法将每一帧的图像加载到AnimationDrawable对象中。

    加载单帧图像到AnimationDrawable对象中
    1         mAnimationDrawable = new AnimationDrawable();
    2         for (int i = 1; i <= 15; i++) {
    3             int resourcesId = getResources().getIdentifier("image"+i, "drawable", mContext.getPackageName());
    4             mDrawable = getResources().getDrawable(resourcesId);
    5             mAnimationDrawable.addFrame(mDrawable, 500);
    6         }

      在本案例中,设置了按键事件监听,通过中键来启动动画,通过Back键来关闭动画(实际是通过关闭当前Activity来实现的)。

      MainActivity.java源代码如下:

    MainActivity.java源代码
     1 package com.example.android_frameanimation;
     2 
     3 import android.os.Bundle;
     4 import android.view.KeyEvent;
     5 import android.app.Activity;
     6 
     7 public class MainActivity extends Activity {
     8 
     9     FrameView mFrameView;                                   //定义帧动画对象
    10     
    11     @Override
    12     public void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         mFrameView = new FrameView(this);
    15         setContentView(mFrameView);                    //加载帧动画视图
    16     }
    17     
    18     //按键按下事件响应
    19     public boolean onKeyDown(int keyCode, KeyEvent event)
    20     {
    21         if ( mFrameView == null )
    22         {
    23             return false;
    24         }
    25         if (keyCode == KeyEvent.KEYCODE_BACK) {         //按下Back键结束当前Activity
    26             this.finish();
    27             return true;
    28         }
    29         mFrameView.onKeyDown(keyCode, event);
    30         return true;
    31     }
    32 }

      FrameView.java源代码如下:

    FrameView.java源代码
     1 package com.example.android_frameanimation;
     2 
     3 import android.content.Context;
     4 import android.graphics.Canvas;
     5 import android.graphics.drawable.AnimationDrawable;
     6 import android.graphics.drawable.Drawable;
     7 import android.view.KeyEvent;
     8 import android.view.View;
     9 
    10 public class FrameView extends View {
    11 
    12     AnimationDrawable mAnimationDrawable;   //AnimationDrawable对象
    13     Drawable mDrawable;              //Drawable对象   
    14     Context mContext;                      //Context对象
    15     
    16     public FrameView(Context context) {
    17         super(context);            
    18         mContext = context;
    19 
    20         //使用Java代码实现帧动画效果
    21         mAnimationDrawable = new AnimationDrawable();
    22         for (int i = 1; i <= 15; i++) {
    23             int resourcesId = getResources().getIdentifier("image"+i, "drawable", mContext.getPackageName());
    24             mDrawable = getResources().getDrawable(resourcesId);
    25             mAnimationDrawable.addFrame(mDrawable, 500);
    26         }
    27         mAnimationDrawable.setOneShot(false);
    28         this.setBackgroundDrawable(mAnimationDrawable);
    29     }
    30     
    31     public void onDraw(Canvas canvas) {
    32         super.onDraw(canvas);
    33     }
    34     
    35     //按键按下事件响应
    36     public boolean onKeyDown(int keyCode, KeyEvent event) {
    37         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {              //按下中键开始动画
    38             mAnimationDrawable.start();
    39         }
    40         return true;
    41     }
    42 }

    3.通过xml布局文件实现Frame Animation动画

      逐帧动画的实现,也可以通过xml布局文件来完成。xml文件可以存放在工程的res/anim目录下。

      Frame动画的xml文件常用属性如下:

    android:drawable[drawable]//加载Drawable对象

    android:duration[long]//每一帧动画的持续时间(单位ms)

    android:oneshot[boolean]//动画是否只运行一次,true运行一次,false重复运行

    android:visible[boolean]//Drawable对象的初始能见度状态,true可见,false不可见(默认为false)

      使用xml来实现Frame动画时,首先可以通过setBackgroundResource()方法来加载xml动画布局文件,然后通过getBackground()方法获得动画,再通过setBackgroundDrawable()方法设置要显示的动画,最后通过start()方法来播放动画即可。

       具体实现只需将FrameView.java源代码稍加改动即可,具体源代码如下:

    FrameView.java源代码
     1 package com.example.android_frameanimation;
     2 
     3 import android.content.Context;
     4 import android.graphics.Canvas;
     5 import android.graphics.drawable.AnimationDrawable;
     6 import android.graphics.drawable.Drawable;
     7 import android.view.KeyEvent;
     8 import android.view.View;
     9 import android.widget.ImageView;
    10 
    11 public class FrameView extends View {
    12 
    13     AnimationDrawable mAnimationDrawable;   //AnimationDrawable对象
    14     Drawable mDrawable;              //Drawable对象   
    15     Context mContext;                      //Context对象
    16     
    17     public FrameView(Context context) {
    18         super(context);            
    19         mContext = context;
    20 
    21         //使用xml文件实现帧动画效果    
    22         ImageView mImageView = new ImageView(mContext);
    23         mImageView.setBackgroundResource(R.anim.frameanimation);
    24         mAnimationDrawable = (AnimationDrawable) mImageView.getBackground();
    25         this.setBackgroundDrawable(mAnimationDrawable);
    26         
    27         mAnimationDrawable.setOneShot(false);
    28         this.setBackgroundDrawable(mAnimationDrawable);
    29     }
    30     
    31     public void onDraw(Canvas canvas) {
    32         super.onDraw(canvas);
    33     }
    34     
    35     //按键按下事件响应
    36     public boolean onKeyDown(int keyCode, KeyEvent event) {
    37         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {              //按下中键开始动画
    38             mAnimationDrawable.start();
    39         }
    40         return true;
    41     }
    42 }

      此外,还需要补充一个frameanimation.xml文件,具体源代码如下:

    frameanimation.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="false"    >
     5     <item android:drawable="@drawable/image1"    android:duration="1000"    />
     6     <item android:drawable="@drawable/image2"    android:duration="1000"    />
     7     <item android:drawable="@drawable/image3"    android:duration="1000"    />
     8     <item android:drawable="@drawable/image4"    android:duration="1000"    />
     9     <item android:drawable="@drawable/image5"    android:duration="1000"    />
    10     <item android:drawable="@drawable/image6"    android:duration="1000"    />
    11     <item android:drawable="@drawable/image7"    android:duration="1000"    />
    12     <item android:drawable="@drawable/image8"    android:duration="1000"    />
    13     <item android:drawable="@drawable/image9"    android:duration="1000"    />
    14     <item android:drawable="@drawable/image10"    android:duration="1000"    />
    15     <item android:drawable="@drawable/image11"    android:duration="1000"    />
    16     <item android:drawable="@drawable/image12"    android:duration="1000"    />
    17     <item android:drawable="@drawable/image13"    android:duration="1000"    />
    18     <item android:drawable="@drawable/image14"    android:duration="1000"    />
    19     <item android:drawable="@drawable/image15"    android:duration="1000"    />
    20     
    21 </animation-list>

     

    相关资料:

    详解Android动画之Frame Animation  http://blog.csdn.net/liuhe688/article/details/6657776

     

  • 相关阅读:
    shared pointer
    realsense数据分析
    cmake log
    Qt自定义类添加qvector报错
    Java csv
    opencv C++ mask_rcnn
    realsense data
    Test
    ubuntu18 bluebooth
    LSTM_Model
  • 原文地址:https://www.cnblogs.com/menlsh/p/2841393.html
Copyright © 2020-2023  润新知