android Animation筆記

 

公告

 

 

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

1. Tween Animation:經過對場景裏的對象不斷作圖像變換(平移、縮放、旋轉)產生動畫效果,便是一種漸變更畫;android

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

動畫類型

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

在XML文件中:動畫

  • alpha        漸變透明度動畫效果
  • scale        漸變尺寸伸縮動畫效果
  • translate  畫面轉換位置移動動畫效果
  • rotate      畫面轉移旋轉動畫效果

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

  • AlphaAnimation漸變透明度動畫效果
  • ScaleAnimation漸變尺寸伸縮動畫效果
  • TranslateAnimation畫面轉換位置移動動畫效果
  • RotateAnimation畫面轉移旋轉動畫效果

image

Tween Animation

一個tween動畫將對視圖對象中的內容進行一系列簡單的轉換(位置,大小,旋轉,透明性)。若是你有一個文本視圖對象,你能夠移動它,旋轉它,讓它變大或讓它變小,若是文字下面還有背景圖像,背景圖像也會隨着文件進行轉換。url

使用XML來定義Tween Animationspa

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

Tween Animation共同的節點屬性orm

屬性[類型] 功能 備註
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-listxmlns:android="http://schemas.android.com/apk/res/android"
   
android:oneshot="true">
   
<itemandroid:drawable="@drawable/rocket_thrust1"android:duration="200"/>
   
<itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
   
<itemandroid: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;

publicvoid 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();
}

publicboolean onTouchEvent(MotionEventevent){
 
if(event.getAction()==MotionEvent.ACTION_DOWN){
    rocketAnimation
.start();
   
returntrue;
 
}
 
returnsuper.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() 中止當前動畫

 

本文參考:Android SDK

               moandroid.com

                eoeandroid.com

 

 

無覓相關文章插件,快速提高流量

相關文章
相關標籤/搜索