Android 平台提供了兩類動畫,一類是 Tween 動畫,即通過對場景里的對象不斷做圖像變換 ( 平移、縮放、旋轉 ) 產生動畫效果;第二類是 Frame 動畫,即順序播放事先做好的圖像,跟電影類似。本次講解的是Tween動畫。
一、View
(1)對於控件View,android自身提供了動畫效果Animation
參考文獻:http://gundumw100.iteye.com/blog/850338
http://blog.csdn.net/rhljiayou/article/details/7194483
Animation是以XML格式定義的,定義好的XML文件存放在res\anim中。
Tween Animation,其由4種類型:
Alpha:漸變透明度動畫效果
Scale:漸變尺寸伸縮動畫效果
Translate:畫面轉換位置移動動畫效果
Rotate:畫面轉換位置移動動畫效果
在介紹以上4種類型前,先介紹Tween Animation共同的節點屬性。
屬性[類型] | 功能 |
Duration[long] | 屬性為動畫持續時間 時間以毫秒為單位 |
fillAfter [boolean] | 當設置為true ,該動畫轉化在動畫結束后被應用 |
fillBefore[boolean] | 當設置為true ,該動畫轉化在動畫開始前被應用 |
interpolator | 指定一個動畫的插入器,有一些常見的插入器。accelerate_decelerate_interpolator:加速-減速 動畫插入器;accelerate_interpolator:加速-動畫插入器;decelerate_interpolator:減速- 動畫插入器,其他的屬於特定的動畫效果 |
repeatCount[int] | 動畫的重復次數 |
repeatMode[String] | 定義重復的行為 1:"restart" 2:"reverse" eg: android:repeatMode="reverse" |
startOffset[long] | 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫 |
zAdjustment[int] | 定義動畫的Z Order的改變 0:保持Z Order不變,1:保持在最上層,-1:保持在最下層 |
下面分別舉例說明4種類型的動畫的定義:
a、alpha漸變透明度動畫效果
<alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ />
fromAlpha屬性為動畫起始時透明度
toAlpha 屬性為動畫結束時透明度
0.0表示完全透明,1.0表示完全不透明,以上值取0.0-1.0之間的float數據類型的數字。
b、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坐標上的伸縮尺寸
toXScale [float] toYScale[float] 為動畫結束時,X、Y坐標上的伸縮尺寸
0.0表示收縮到沒有,1.0表示正常無伸縮,值小於1.0表示收縮,值大於1.0表示放大
pivotX[float] pivotY[float] 為動畫相對於物件的X、Y坐標的開始位置
屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置
c、translate畫面轉換位置移動動畫效果
<translate android:fromXDelta=”30″ android:toXDelta=”-80″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ />
fromXDelta toXDelta 為動畫、結束起始時 X坐標上的位置
fromYDelta toYDelta 為動畫、結束起始時 Y坐標上的位置
d、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 為動畫起始時物件的角度 說明
toDegrees 屬性為動畫結束時物件旋轉的角度 可以大於360度
當角度為負數——表示逆時針旋轉
當角度為正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
pivotX pivotY 為動畫相對於物件的X、Y坐標的開始位
說明:以上兩個屬性值 從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置
按照上面的講述學習完了Tween Animation的定義,對Tween Animation有了詳細的了解,再去了解下Android SDK的animation package(android.view.animation),其提供了操作Tween Animation所有的類。
下面舉例說明Tween Animation如何使用。
Android SDK提供了2種方法:
a、直接從XML資源中讀取Animation
下面給出一個完整的XML定義(SDK提供) <set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.0" android:toXScale="1.4" android:fromYScale="1.0" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="700" /> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="1.4" android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" android:fillBefore="false" /> <rotate android:fromDegrees="0" android:toDegrees="-45" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="700" android:duration="400" /> </set> </set>
下面簡要說明從XML資源中讀取Animation,按照應用程序開發的過程,介紹整個使用的過程,如下:
創建Android工程;導入一張圖片資源;
在res\layout\main.xml中添加一個 ImageView Widget;
在res下創建新的文件夾且命名為:anim,並在此文件夾下面定義 Animation XML 文件;
修改OnCreate()中的代碼,顯示動畫資源;
基本的調用xml方法如下:
//main.xml中的ImageView ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); //加載動畫 Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); //使用ImageView顯示動畫 spaceshipImage.startAnimation(hyperspaceJumpAnimation);
至於其他的load動畫的方法,請參考相關SDK
b、使用Animation子類的構造函數來初始化Animation對象
//在代碼中定義 動畫實例對象 private Animation myAnimation_Alpha; private Animation myAnimation_Scale; private Animation myAnimation_Translate; private Animation myAnimation_Rotate; //根據各自的構造方法來初始化一個實例對象 myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
下面開始簡要介紹怎樣控制動畫:
對於控制動畫顯示,Android也提供了相應的接口。動畫的進度使用 Interpolator 控制。Interpolator 定義了動畫的變化速度,可以實現勻速、正加速、負加速、無規則變加速等。Interpolator 是基類,封裝了所有 Interpolator 的共同方法,它只有一個方法,即 getInterpolation (float input),該方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了幾個 Interpolator 子類,實現了不同的速度曲線,如下:
AccelerateDecelerateInterpolator | 在動畫開始與介紹的地方速率改變比較慢,在中間的時候加速 |
AccelerateInterpolator | 在動畫開始的地方速率改變比較慢,然后開始加速 |
CycleInterpolator | 動畫循環播放特定的次數,速率改變沿着正弦曲線 |
DecelerateInterpolator | 在動畫開始的地方速率改變比較慢,然后開始減速 |
LinearInterpolator | 在動畫的以均勻的速率改變 |
對於 LinearInterpolator ,變化率是個常數,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}
Interpolator其他的幾個子類,也都是按照特定的算法,實現了對變化率。還可以定義自己的 Interpolator 子類,實現拋物線、自由落體等物理效果。
接着簡要介紹下動畫的運行模式
獨占模式,即程序主線程進入一個循環,根據動畫指令不斷刷新屏幕,直到動畫結束
中斷模式,即有單獨一個線程對時間計數,每隔一定的時間向主線程發通知,主線程接到通知后更新屏幕
運行模式是由UI代碼自行控制的
相關例子demo:myAnimation.zip