Android動畫分析
文本是閱讀《Android開發藝術探索》的學習筆記記錄,詳細內容可以自行閱讀書本。
Android動畫分析
Android的動畫可以分爲三種:View動畫、幀動畫和屬性動畫。雖然幀動畫也屬於View動畫,但是與傳統方式不同,所以單獨從分類中取出。
1 View動畫
View動畫的作用對象是View,它支持4種動畫效果,分別是平移動畫、縮放動畫、旋轉動畫和透明度動畫。
1.1 View動畫的種類
名稱 | 標籤 | 子類 | 效果 |
---|---|---|---|
平移動畫 | <translate> | TranslateAnimation | 移動View |
縮放動畫 | <scale> | ScaleAnimation | 放大或縮小View |
旋轉動畫 | <rotate> | RotateAnimation | 旋轉View |
透明度動畫 | <alpha> | AlphaAnimation | 改變View的透明度 |
要使用View動畫,首先需要創建動畫的XML文件。路徑爲res/anim/filename.xml。如下,
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha=""
android:toAlpha=""></alpha>
<translate
android:fromXDelta=""
android:fromYDelta=""
android:toXDelta=""
android:toYDelta=""></translate>
<scale
android:fromXScale=""
android:fromYScale=""
android:pivotX=""
android:pivotY=""
android:toXScale=""
android:toYScale=""></scale>
<rotate
android:fromDegrees=""
android:pivotX=""
android:pivotY=""
android:toDegrees=""></rotate>
</set>
從上面語法可以看出,View動畫可以由單一動畫或者一系列動畫組成。
<set>標籤表示動畫集合,對應AnimationSet類,它的兩個屬性含義如下:
android:interpolator:表示動畫集合採用的插值器,插值器會影響動畫的速度,例如勻速、非勻速等等。
android:shareInterpolator:表示集合中的動畫是否和集合共享同一個插值器。
<translate>標籤表示平移動畫,對應TranslateAnimation類,屬性含義如下:
android:fromXDelta:表示x的起始值,比如0。
android:toXDelta:表示x的結束值,比如100。
android:fromYDelta:表示y的起始值,比如0。
android:toYDelta:表示y的結束值,比如100。
<scale>標籤表示縮放動畫,對應ScaleAnimation類,屬性含義如下:
android:fromXScale:水平方向縮放的起始值,比如0.5。
android:toXScale:水平方向縮放的結束值,比如1.2。
android:fromYScale:豎直方向縮放的起始值。
android:toYScale:豎直方向縮放的結束值。
android:pivotX:縮放的軸點的x座標。
android:pivotY:縮放的軸點的y座標。
默認情況下,縮放是以View的中心點爲軸點進行,當水平縮放時,左右兩邊同時進行縮放。如果將軸點的x座標設置在左邊界,當水平縮放時,View就只會向右邊縮放。
<rotate>標籤表示旋轉動畫,對應RotateAnimation類,屬性含義如下:
android:fromDegrees:旋轉開始的角度,比如0。
android:toDegrees:旋轉結束的角度,比如180。
android:pivotX:旋轉的軸點的x座標。
android:pivotY:旋轉的軸點的y座標。
<alpha>標籤表示旋轉動畫,對應RotateAnimation類,屬性含義如下:
android:fromAlpha:表示透明度的起始值,比如0.1。
android:toAlpha:表示透明度的結束值,比如1。
除此之外,還有一些常用的屬性,如下:
android:fillAfter:動畫結束後是否停留在結束位置。
android:duration:動畫的持續時間。
代碼中,如下引用。
Animation animation = AnimationUtils.loadAnimation(this, R.anim.test);
startBt.startAnimation(animation);
除了XML定義外,也可以代碼簡單創建動畫,如下。
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(300);
alphaAnimation.setRepeatCount(Animation.INFINITE);
stopBt.startAnimation(alphaAnimation);
1.2 幀動畫
幀動畫是順序播放一組圖片,類似電影播放,我們需要通過目錄在drawable下的XML文件來定義一個AnimationDrawable,如下。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@drawable/ic_launcher_background"
android:duration="500"></item>
<item
android:drawable="@drawable/ic_launcher_background"
android:duration="500"></item>
<item
android:drawable="@drawable/ic_launcher_background"
android:duration="500"></item>
</animation-list>
2 View動畫的特殊使用場景
2.1 LayoutAnimation
LayoutAnimation作用與ViewGroup,爲ViewGroup指定一個動畫,這樣它的每個子元素出場時都會有這種動畫效果。這種效果常用於ListView上,使每個item都以一定動畫的形式出現。操作步驟如下。
(1)首先定義LayoutAnimation
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/test"
android:animationOrder="normal"
android:delay="0.5">
</layoutAnimation>
android:delay:動畫的時間延遲。
android:animationOrder:子元素動畫入場的順序。
android:animation:子元素的具體入場動畫。
(2)爲子元素指定具體入場動畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="100"
android:fillAfter="true"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"></alpha>
</set>
(3)爲ViewGroup指定android:layoutAnimation屬性
android:layoutAnimation="@anim/layout_anim"
或者代碼中實現,代碼如下。
Animation animation = AnimationUtils.loadAnimation(this, R.anim.test);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(500);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);
2.2 Activity切換效果
Activity有默認的切換效果,但是我們可以自定義這個效果。主要用到overridePendingTransition()方法,這個方法必須在startActivity()或者finish()之後調用才能生效。參數中一個代表打開時動畫,一個代表暫停時動畫。
finish();
overridePendingTransition(R.anim.test, R.anim.test);