【android】動畫效果研究(View)【1】


    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM