Android Animation學習筆記

來源:互聯網
上載者:User

 

關於動畫的實現,Android提供了Animation,在Android SDK介紹了2種Animation模式:

 

1. Tween Animation:通過對情境裡的對象不斷做映像變換(平移、縮放、旋轉)產生動畫效果,即是一種漸層動畫;

 

2. Frame Animation:順序播放事先做好的映像,是一種畫面轉換動畫。

 

動畫類型

下面先來看看Android提供的動畫類型。Android的animation由四種類型組成

 

在XML檔案中:

 

alpha        漸層透明度動畫效果

scale        漸層尺寸伸縮動畫效果

translate  畫面轉換位置移動動畫效果

rotate      畫面轉移旋轉動畫效果

在Java 源碼中定義了相應的類,可以使用這些類的方法來擷取和操作相應的屬性:

 

AlphaAnimation漸層透明度動畫效果

ScaleAnimation漸層尺寸伸縮動畫效果

TranslateAnimation畫面轉換位置移動動畫效果

RotateAnimation畫面轉移旋轉動畫效果

 

Tween Animation

 

一個tween動畫將對視圖對象中的內容進行一系列簡單的轉換(位置,大小,旋轉,透明性)。如果你有一個文本視圖對象,你可以移動它,旋轉它,讓它變大或讓它變小,如果文字下面還有背景映像,背景映像也會隨著檔案進行轉換。

 

使用XML來定義Tween Animation

 

動畫的XML檔案在工程中res/anim目錄,這個檔案必須包含一個根項目,可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入<set>元素組中,預設情況下,所以的動畫指令都是同時發生的,為了讓他們按序列發生,需要設定一個特殊的屬性startOffset。動畫的指令定義了你想要發生什麼樣的轉換,當他們發生了,應該執行多長時間,轉換可以是連續的也可以使同時的。例如,你讓常值內容從左邊移動到右邊,然後旋轉180度,或者在移動的過程中同時旋轉,沒個轉換需要設定一些特殊的參數(開始和結束的大小尺寸的大小變化,開始和結束的旋轉角度等等,也可以設定些基本的參數(例如,開始時間與周期),如果讓幾個轉換同時發生,可以給它們設定相同的開始時間,如果按序列的話,計算開始時間加上其周期。

 

Tween Animation共同的節點屬性

 

屬性[類型] 功能 備忘

Duration[long] 屬性為動畫期間 時間以毫秒為單位

fillAfter [boolean] 當設定為true ,該動畫轉化在動畫結束後被應用

fillBefore[boolean] 當設定為true ,該動畫轉化在動畫開始前被應用

interpolator

指定一個動畫的插入器 有一些常見的插入器

accelerate_decelerate_interpolator

加速-減速 動畫插入器

accelerate_interpolator

加速-動畫插入器

decelerate_interpolator

減速- 動畫插入器

其他的屬於特定的動畫效果

repeatCount[int] 動畫的重複次數 

RepeatMode[int] 定義重複的行為1:重新開始  2:plays backward

startOffset[long] 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫

zAdjustment[int] 定義動畫的Z Order的改變0:保持Z Order不變

1:保持在最上層

-1:保持在最下層

表二

 

XML節點 功能說明

alpha 漸層透明度動畫效果

<alpha

android:fromAlpha=”0.1″

android:toAlpha=”1.0″

android:duration=”3000″/>

fromAlpha 屬性為動畫起始時透明度

0.0表示完全透明

1.0表示完全不透明

以上值取0.0-1.0之間的float資料類型的數字

 

duration為動畫期間,ms單位

 

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方向座標上的中點位置

 

下面給出一個完整的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>

Tween Animation如何使用

 

使用AnimationUtils類的靜態方法loadAnimation()來載入XML中的動畫XML檔案

 

//main.xml中的ImageView

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);

//載入動畫

Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);

//使用ImageView顯示動畫

spaceshipImage.startAnimation(hyperspaceJumpAnimation);

如何在Java代碼中定義動畫

 

//在代碼中定義 動畫執行個體對象

 

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);

 

interpolator的解釋

 

interpolator定義一個動畫的變動率(the rate of change)。這使得基本的動畫效果(alpha, scale, translate, rotate)得以加速,減速,重複等。

 

 

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 在動畫的以均勻的速率改變

 

 

 

 

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,顯示動畫的代碼:

 

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()中啟動動畫,就只能看到第一張圖片。這裡實在拖曳事件中實現的。

 

下面,閱讀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() 停止當前動畫

 

作者 不想睡的豬

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.