Android學習筆記15:Frame Animation動畫的實現

來源:互聯網
上載者:User

在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>
 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.