天天看點

Android Animation(Frame Animation)

http://hi.baidu.com/baibaixiaoyao/blog/item/5c9e92529b759c1d0cf3e3b0.html

[不完全轉載,原文:http://www.cnblogs.com/feisky/archive/2010/01/11/1644482.html]

Frame Animation

Frame Animation是順序播放事先做好的圖像,跟電影類似。不同于animation package, Android SDK提供了另外一個類AnimationDrawable來定義、使用Frame Animation。

Frame Animation可以在XML Resource定義(還是存放到res\anim檔案夾下),也可以使用AnimationDrawable中的API定義。由于Tween Animation與Frame Animation有着很大的不同,是以XML定義的格式也完全不一樣,其格式是:首先是animation-list根節點,animation-list根節點中包含多個item子節點,每個item節點定義一幀動畫,目前幀的drawable資源和目前幀持續的時間。下面對節點的元素加以說明: 

XML屬性 說明
drawable 目前幀引用的drawable資源
duration 目前幀顯示的時間(毫秒為機關)
oneshot 如果為true,表示動畫隻播放一次停止在最後一幀上,如果設定為false表示動畫循環播放。
variablePadding If true, allows the drawable’s padding to change based on the current state that is selected.
visible 規定drawable的初始可見性,預設為flase;
AnimationDrawable
擷取、設定動畫的屬性
int getDuration() 擷取動畫的時長
int getNumberOfFrames() 擷取動畫的幀數

boolean isOneShot()

Void setOneShot(boolean oneshot)

擷取oneshot屬性

設定oneshot屬性

void inflate(Resurce r,XmlPullParser p,

AttributeSet attrs)

增加、擷取幀動畫
Drawable getFrame(int index) 擷取某幀的Drawable資源
void addFrame(Drawable frame,int duration) 為目前動畫增加幀(資源,持續時長)
動畫控制
void start() 開始動畫
void run() 外界不能直接掉調用,使用start()替代
boolean  isRunning() 目前動畫是否在運作
void stop() 停止目前動畫

下面就給個具體的XML例子,來定義一幀一幀的動畫:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"

    android:oneshot="true">

    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />

    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />

    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />

</animation-list>

上面的XML就定義了一個Frame Animation,其包含3幀動畫,3幀動畫中分别應用了drawable中的3張圖檔:rocket_thrust1,rocket_thrust2,rocket_thrust3,每幀動畫持續200毫秒。

然後我們将以上XML儲存在res/anim/檔案夾下,命名為rocket_thrust.xml,顯示動畫的代碼:

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);

  rocketImage.setBackgroundResource(R.anim.rocket_thrust);

  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

}

public boolean onTouchEvent(MotionEvent event) {

  if (event.getAction() == MotionEvent.ACTION_DOWN) {

    rocketAnimation.start();

    return true;

  }

  return super.onTouchEvent(event);

}

代碼運作的結果:3張圖檔按照順序的播放一次.

有一點需要強調的是:啟動Frame Animation動畫的代碼rocketAnimation.start();不能在OnCreate()中,因為在OnCreate()中AnimationDrawable還沒有完全的與ImageView綁定,在OnCreate()中啟動動畫,就隻能看到第一張圖檔。這裡實在拖曳事件中實作的。(這裡現在main.xml裡定義一個ImageView,可以先不指定src,運作時會自動綁定)

下面,閱讀Android SDK中對AnimationDrawable的介紹,有個簡單的了解: