Android的動畫布局

 一、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;

下面就給個具體的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,顯示動畫的代碼,如下:在OnCreate()中增加如下代碼:
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()中啓動動畫,就只能看到第一張圖片。

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

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() 停止當前動畫

 

 

 

二、Tween Animation

隨着對Drewable的深入瞭解,發現了Drawable更加強大的功能:顯示Animation。Android SDK介紹了2種Animation:

Tween Animation:通過對場景裏的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果
Frame Animation:順序播放事先做好的圖像,跟電影類似
在使用Animation前,我們先學習如何定義Animation,這對我們使用Animation會有很大的幫助。Animation是以XML格式定義的,定義好的XML文件存放在res/anim中。由於Tween Animation與Frame Animation的定義、使用都有很大的差異,我們將分開介紹,本篇幅中介紹Tween Animation的定義與使用,後續篇幅再詳細介紹Frame Animation。按照XML文檔的結構【父節點,子節點,屬性】來介紹Tween Animation,其由4種類型:

Alpha:漸變透明度動畫效果
Scale:漸變尺寸伸縮動畫效果
Translate:畫面轉換位置移動動畫效果
Rotate:畫面轉換位置移動動畫效果
表一
 
屬性[類型] 功能 
Duration[long] 屬性爲動畫持續時間 時間以毫秒爲單位
fillAfter [boolean] 當設置爲true ,該動畫轉化在動畫結束後被應用
fillBefore[boolean] 當設置爲true ,該動畫轉化在動畫開始前被應用
interpolator
 指定一個動畫的插入器 有一些常見的插入器
accelerate_decelerate_interpolator
加速-減速 動畫插入器
accelerate_interpolator
加速-動畫插入器
decelerate_interpolator
減速- 動畫插入器
其他的屬於特定的動畫效果
repeatCount[int] 動畫的重複次數 
RepeatMode[int] 定義重複的行爲 1:restart  2:reverse
startOffset[long] 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫
zAdjustment[int] 定義動畫的Z Order的改變 0:保持Z Order不變
1:保持在最上層
-1:保持在最下層

看了以上節點,大家是不是都想開始定義動畫了。下面我們就開始結合具體的例子,介紹4種類型各自特有的節點元素。

表二
 
XML節點 功能說明
alpha 漸變透明度動畫效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha 屬性爲動畫起始時透明度
 0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字
toAlpha 屬性爲動畫結束時透明度
表三
 
scale 漸變尺寸伸縮動畫效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float] 爲動畫起始時,X、Y座標上的伸縮尺寸 0.0表示收縮到沒有
1.0表示正常無伸縮
值小於1.0表示收縮
值大於1.0表示放大
toXScale [float]
toYScale[float] 爲動畫結束時,X、Y座標上的伸縮尺寸
pivotX[float]
pivotY[float] 爲動畫相對於物件的X、Y座標的開始位置 屬性值說明:從0%-100%中取值,50%爲物件的X或Y方向座標上的中點位置
   
表四
 
translate 畫面轉換位置移動動畫效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta 爲動畫、結束起始時 X座標上的位置 
fromYDelta
toYDelta 爲動畫、結束起始時 Y座標上的位置 
   
表五
 
rotate 畫面轉移旋轉動畫效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees 爲動畫起始時物件的角度 說明
當角度爲負數——表示逆時針旋轉
當角度爲正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
toDegrees 屬性爲動畫結束時物件旋轉的角度 可以大於360度
pivotX
pivotY 爲動畫相對於物件的X、Y座標的開始位 說明:以上兩個屬性值 從0%-100%中取值
50%爲物件的X或Y方向座標上的中點位置

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章