動畫效果(一)-漸變動畫
第1節 概述
在安卓系統中,為了介面或者其中的元件在切換、改變的時候顯得自然生動、具有流動性的美感,就給它們添加了動畫的效果。
例如圖片切換的時候,前一張圖片淡出,後一張圖片淡入。
動畫分了三類: frame動畫(逐幀動畫)、 property動畫(屬性動畫)、 tween動畫(漸變動畫)。
逐幀動畫有點像播放電影,它把很多圖片串起來,按照順序一張一張顯示,通過播放形成動畫效果;
屬性動畫是對控制元件某個屬性使用的動畫,例如一個按鈕的寬度要從窄設定到寬,而我們希望它的寬度調整的時候,能看到它從窄到寬變化的過程,這時就需要使用屬性動畫。
漸變動畫是對控制元件整體使用的動畫,有四種最常見到的效果:透明、平移、縮放和旋轉。
/*******************************************************************/
* 版權宣告
* 本教程只在CSDN和安豆網釋出,其他網站出現本教程均屬侵權。
/*******************************************************************/
第2節 漸變動畫
漸變動畫有四種最常見到的效果:透明、平移、縮放和旋轉。這四種效果都有共同點,
- 動畫物件作為整體一點點變化;
- 這是一個狀態的遷移過程,需要時間的配合,動畫的時間長短可以指定,動畫變化的速度也是可以指定的;
- 動畫執行後,這個動畫的物件,並不是真正的變成了動畫展示的那樣,它其實還保持著以前的樣子,你看到的不過是個它的影子罷了,動畫結束,影子就消失了。
動畫效果可以通過資原始檔定義,也可以通過程式碼來定義。
2.1 透明動畫
透明動畫的效果是,動畫物件的透明度從一個程度變成另一個程度。例如從透明變成不透明這種淡入效果。
2.1.1 xml定義透明動畫
通過xml定義透明動畫,
- 在
res
下新建一個anim目錄
,然後在這個目錄下建立一個xml檔案
; 定義動畫效果,
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android
透明動畫的各個屬性代表瞭如下的含義:
<alpha/>
標籤:這是一個透明效果的動畫;fromAlpha
:動畫開始時,動畫物件的透明度值,取值在0-1
之間,0是完全透明,1是完全不透明,0
和1
之間的值就是各種半透效果;toAlpha
:動畫結束時,動畫物件的透明度值,取值在0-1
之間;duration
:動畫持續的時間,單位是毫秒;interpolator
:這是插值器,用來指定動畫變化的速率,例如是先快後慢,還是先慢後快,或者是均勻的變化。安卓系統為我們提供了很多現成的插值器,我們可以直接使用,例如上面的線性插值器@android:anim/linear_interpolator
;
淡入效果就是剛開始沒有顯示,逐漸顯示出來,所以它的fromAlpha
就要設定成0
,toAlpha
設定成1
;
淡出效果就是剛開始顯示,逐漸隱藏起來,所以它的fromAlpha
就要設定成1
,toAlpha
設定成0
;
另外,Android SDK也提供了自定義插值器的方法,我們在以後介紹。
2.1.2 java程式碼定義透明動畫
通過java程式碼定義透明動畫,
- 建立一個AlphaAnimation,填入起始alpha值和結束的alpha值;
- 設定持續時間;
- 設定插值器;
AlphaAnimation anim = new AlphaAnimation(0, 1);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
2.2 平移動畫
平移動畫的效果是,動畫物件沿著水平方向或者垂直方向移動(或者兩個方向同時移動)到另一位置。
2.2.1 xml定義平移動畫
通過xml定義透明動畫,
- 在
res
下新建一個anim目錄
,然後在這個目錄下建立一個xml檔案
; 定義動畫效果,
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%" android:fromYDelta="-100%" android:toXDelta="0%" android:toYDelta="0%" android:duration="1500" android:interpolator="@android:anim/linear_interpolator"/> </set>
平移動畫的各個屬性代表瞭如下的含義:
<translate/>
標籤:這是一個平移效果的動畫;fromXDelta
:動畫開始時,動畫物件相對於它真實位置在x方向上的座標;fromYDelta
:動畫開始時,動畫物件相對於它真實位置在y方向上的座標;toXDelta
:動畫結束時,動畫物件相對於它真實位置在y方向上的座標;toYDelta
:動畫結束時,動畫物件相對於它真實位置在y方向上的座標;duration
:動畫持續的時間,單位是毫秒;interpolator
:這是插值器,用來指定動畫變化的速率;
起始座標有3種表達方式:
- 動畫物件的絕對位置:用數值表示。
動畫物件相對自身的位置:用
%
表示。例如給fromXDelta
設定-100%
,表示動畫開始時,起始的左邊邊界相對於自身真實位置,在負的自身寬度的地方;動畫物件相對於它父佈局的位置:用
%p
表示,這裡的p
就是parent
的縮寫。
讓物件從左往右平移進入的效果,就是讓它的fromXDelta
設定成-100%
,toXDelta
設定成0%
;fromYDelta
設定成0%
;toYDelta
設定成0%
;
讓物件從下往上平移進入的效果,就是讓它的fromXDelta
設定成0%
,toXDelta
設定成0%
;fromYDelta
設定成100%
(y座標是從上到下為正方向);toYDelta
設定成0%
;
2.2.2 java程式碼定義平移動畫
通過java程式碼定義平移動畫,
- 建立一個TranslateAnimation,填入x y方向的起始座標和結束座標;設定座標時,可以設定座標的型別,
Animation.RELATIVE_TO_SELF
表示使用相對自身的位置座標,Animation.RELATIVE_TO_PARENT
表示使用相對父佈局的位置座標,Animation.ABSOLUTE
表示使用絕對位置座標; - 設定持續時間;
- 設定插值器;
//使用座標的絕對位置建立動畫
TanslateAnimation anim = new TanslateAnimation(-150, 0, -50, 0);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
//使用座標的相對位置建立動畫
TanslateAnimation anim = new TanslateAnimation(Animation.RELATIVE_TO_SELF, -1.0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1.0, Animation.RELATIVE_TO_SELF, 0);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
2.3 縮放動畫
伸縮動畫的效果是,動畫物件以某個位置為中心進行放大或者縮小。
2.3.1 xml定義伸縮動畫
通過xml定義伸縮動畫,
- 在
res
下新建一個anim目錄
,然後在這個目錄下建立一個xml檔案
; 定義動畫效果,
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="-100%" android:fromYScale="-100%" android:toXScale="0%" android:toYScale="0%" android:pivotX="50%" android:pivotY="50%" android:duration="1500" android:interpolator="@android:anim/linear_interpolator"/> </set>
伸縮動畫的各個屬性代表瞭如下的含義:
<scale/>
標籤:這是一個伸縮效果的動畫;fromXScale
:動畫開始時,動畫物件在x方向上相對於它真實大小的縮放比例;fromYScale
:動畫開始時,動畫物件在x方向上相對於它真實大小的縮放比例;toXScale
:動畫結束時,動畫物件在y方向上相對於它真實大小的縮放比例;toYScale
:動畫結束時,動畫物件在y方向上相對於它真實大小的縮放比例;duration
:動畫持續的時間,單位是毫秒;interpolator
:這是插值器,用來指定動畫變化的速率;pivotX
:動畫進行縮放時的中心點x座標;pivotY
:動畫進行縮放時的中心點y座標;
這裡的pivotX
與pivotY
可以設定絕對座標,也可以設定相對自身的相對座標%
,以及相對於父佈局的相對座標%p
。
2.3.2 java程式碼定義伸縮動畫
通過java程式碼定義伸縮動畫,
- 建立一個ScaleAnimation,填入x y方向的起始伸縮比例和結束伸縮比例;設定中心座標時,可以設定座標的型別,
Animation.RELATIVE_TO_SELF
表示使用相對自身的位置座標,Animation.RELATIVE_TO_PARENT
表示使用相對父佈局的位置座標,Animation.ABSOLUTE
表示使用絕對位置座標; - 設定持續時間;
- 設定插值器;
//使用中心點的絕對位置建立動畫
ScaleAnimation anim = new ScaleAnimation(1, 2, 1, 2, 50, 150);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
//使用中心點的相對位置建立動畫
ScaleAnimation anim = new ScaleAnimation(1, 2, 1, 2, Animation.RELATIVE_TO_SELF, 0.5, Animation.RELATIVE_TO_SELF, 0.5);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
2.4 旋轉動畫
旋轉動畫的效果是,動畫物件以某個位置為中心進行旋轉。
2.4.1 xml定義旋轉動畫
通過xml定義旋轉動畫,
- 在
res
下新建一個anim目錄
,然後在這個目錄下建立一個xml檔案
; 定義動畫效果,
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="1500" android:interpolator="@android:anim/linear_interpolator"/> </set>
伸縮動畫的各個屬性代表瞭如下的含義:
<rotate/>
標籤:這是一個旋轉效果的動畫;fromDegrees
:動畫開始時,動畫物件相對於真實位置旋轉的角度;toDegrees
:動畫開始時,動畫物件相對於真實位置旋轉的角度;duration
:動畫持續的時間,單位是毫秒;interpolator
:這是插值器,用來指定動畫變化的速率;pivotX
:動畫進行縮放時的中心點x座標;pivotY
:動畫進行縮放時的中心點y座標;
這裡的pivotX
與pivotY
可以設定絕對座標,也可以設定相對自身的相對座標%
,以及相對於父佈局的相對座標%p
。
2.4.2 java程式碼定義旋轉動畫
通過java程式碼定義旋轉動畫,
- 建立一個RotateAnimation,填入起始角度和結束角度;設定中心座標時,可以設定座標的型別,
Animation.RELATIVE_TO_SELF
表示使用相對自身的位置座標,Animation.RELATIVE_TO_PARENT
表示使用相對父佈局的位置座標,Animation.ABSOLUTE
表示使用絕對位置座標; - 設定持續時間;
- 設定插值器;
//使用中心點的絕對位置建立動畫
RotateAnimation anim = new RotateAnimation(0, 360, 50, 150);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
//使用中心點的相對位置建立動畫
ScaleAnimation anim = new ScaleAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5, Animation.RELATIVE_TO_SELF, 0.5);
anim.setDuration(1500);
anim.setInterpolator(context, android.R.interpolator.linear);
2.5 使用動畫
2.5.1 使用xml定義的動畫
- 使用
AnimationUtils.loadAnimation()
裝載動畫; - 對要使用動畫的物件使用
startAnimation()
函式,啟動動畫;
Animation anim = AnimationUtils.loadAnimation(this, R.anim.custom_anim);
mAnimationTarget.startAnimation(anim);
2.5.2 使用程式碼定義的動畫
使用程式碼定義的動畫就和使用xml一樣,對要使用動畫的物件使用startAnimation()
函式,啟動動畫;
mAnimationTarget.startAnimation(anim);
2.6 多個動畫效果疊加
這幾種動畫不僅可以單獨使用,也可以混合著使用,例如你希望一個物件一邊淡入一邊做平移。
2.6.1 xml定義多個動畫
對同一個物件同時使用多個動畫效果,只要在定義動畫的xml檔案中,新增多個希望的動畫就行了。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
....../>
<scale
....../>
<translate
....../>
<alpha
....../>
</set>
2.6.2 java程式碼定義多個動畫
在java程式碼中可以,
- 建立多個動畫;
- 建立AnimationSet;
- 將建立的多個動畫加入到AnimatonSet當中;
TranslateAnimation anim1 = new TranslateAnimation(...);
ScaleAnimation anim2 = new ScaleAnimation(...);
AlphaAnimation Anim3 = new AlphaAnimation(...);
RotateAnimation anim4 = new RotateAnimation(...);
AnimationSet set = new AnimationSet(true);
set.addAnimation(anim1);
set.addAnimation(anim2);
set.addAnimation(anim3);
set.addAnimation(anim4);
mAnimationTarget.startAnimation(set);
2.7 漸變動畫的監聽
有的時候,需要知道一個動畫執行的狀態,就需要給動畫新增一個監聽器。通過監聽器獲得動畫狀態變化的通知。
TranslateAnimation anim = new TranslateAnimation(...);
anim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//動畫開始
}
@Override
public void onAnimationEnd(Animation animation) {
//動畫結束
}
@Override
public void onAnimationRepeat(Animation animation) {
//動畫重複執行
}
});
2.8 漸變動畫的其它共同屬性
在前面我們已經介紹了android:duration
android:interpolator
等共同的屬性。現在我們再介紹幾個其它的重要屬性。
2.8.1 android:fillAfter
假設一個按鈕被使用透明效果的動畫,從不透明變到全透明。動畫完成後,這個按鈕會被還原到它的真實狀態(按鈕並沒有消失或透明,仍然顯示在以前的位置)。
如果給這個動畫設定了android:fillAfter
屬性為true
,那麼在執行完動畫後,按鈕還是保持動畫最後一幀的效果。
這兩個屬性要設定在<set/>
標籤當中才能有效果。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="false">
......
</set>
也就是說,如果是用程式碼建立動畫的話,得把這個動畫放到AnimationSet
之中再來設定屬性。
RotateAnimation anim = new RotateAnimation(...);
AnimationSet set = new AnimationSet(true);
set.addAnimation(anim);
set.setFillAfter(true);
2.8.2 android:repeatMode
與android:repeatCount
可以通過設定android:repeatCount
的數值,讓動畫重複播放;
- 該值為大於
0
:動畫重複該數值表示的次數; - 該值設定為
INFINITE
:動畫將會無限迴圈進行下去;
當android:repeatCount
被設定大於0
以後,還可以配合使用android:repeatMode
,
- 該值設定為
RESTART
:每一次動畫執行完成後,回到最初狀態重新執行下一次動畫; - 該值設定為
REVERSE
:每一次動畫執行完成後,動畫倒著執行;
/*******************************************************************/
* 版權宣告
* 本教程只在CSDN和安豆網釋出,其他網站出現本教程均屬侵權。
*另外,我們還推出了Arduino智慧硬體相關的教程,您可以在我們的網店跟我學Arduino程式設計中購買相關硬體。同時也感謝大家對我們這些碼農的支援。
*最後再次感謝各位讀者對安豆
的支援,謝謝:)
/*******************************************************************/