View Animation
你可以使用視圖動畫系統(tǒng)在視圖上執(zhí)行補(bǔ)間動畫。Tween動畫使用諸如動畫的起始點(diǎn),終點(diǎn),大小,旋轉(zhuǎn)以及其他常見方面的信息來計算動畫。(編者按:Tween動畫是操作某個控件讓其展現(xiàn)出旋轉(zhuǎn)、漸變、移動、縮放的這么一種轉(zhuǎn)換過程,我們稱為補(bǔ)間動畫。)補(bǔ)間動畫可以對View對象的內(nèi)容執(zhí)行一系列簡單的轉(zhuǎn)換(位置,大小,旋轉(zhuǎn)和透明度)。 所以,如果你有一個TextView對象,你可以移動,旋轉(zhuǎn),增長或收縮文本。 如果它有一個背景圖像,背景圖像將與文本一起轉(zhuǎn)換。
The animation package 提供了補(bǔ)間動畫中使用的所有類。
一系列動畫指令定義了由XML或Android代碼定義的補(bǔ)間動畫。與定義布局一樣,建議使用XML文件,因為它比硬編碼動畫更可讀,可重用和可交換。在下面的例子中,我們使用XML。(要了解更多關(guān)于在應(yīng)用程序代碼中定義動畫,而不是XML,請參考AnimationSet類和其他Animation子類。)動畫指令定義您想要發(fā)生的轉(zhuǎn)換何時發(fā)生以及應(yīng)用這些動畫所需的時間,轉(zhuǎn)換可以是順序的或同時的(編者按:真是沒搞懂在屬性動畫的后面來介紹這篇,頭重腳輕的感覺)。例如,您可以使TextView的內(nèi)容從左到右移動,然后旋轉(zhuǎn)180度,或者您可以同時移動文本并旋轉(zhuǎn)。 每個變換都需要一組特定于該變換的參數(shù)(起始大小和大小變化的起始大小,起始角度和旋轉(zhuǎn)結(jié)束角度等等)以及一組常用參數(shù)(例如開始時間和持續(xù)時間)。 要同時進(jìn)行幾次轉(zhuǎn)換,給他們相同的開始時間; 使它們連續(xù),計算開始時間加上一次變換的持續(xù)時間。
動畫XML文件屬于您的Android項目的res / anim /目錄(編者按:這里需要你在res文件夾下面自己定義一個anim的目錄,然后你建文件的時候里面會生成)。該文件必須具有單個根元素:將會是單個 interpolator element,或者元素包含上面的一種或者幾種(也有可能包含標(biāo)簽)。默認(rèn)情況下,所有動畫指令同時應(yīng)用。 要使它們順序發(fā)生,你必須指定startOffset屬性,如下面的示例所示。來自ApiDemos,下面的XML用于拉伸,然后同時旋轉(zhuǎn)和旋轉(zhuǎn)View對象。
<set android:shareInterpolator="false">
<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>
屏幕坐標(biāo)(本示例中未使用)在左上角為(0,0),并且向下和向右增加。某些值(例如pivotX)可以相對于對象本身或相對于父對象指定。 一定要使用正確的格式,你想要的(“50”為50%相對于父,或“50%”為50%相對于自己)。(編者按:這里先參照了官網(wǎng)的文檔,但是還是不太明了,所以我再解釋一下:pivotX對應(yīng)的值可以是數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p 三種樣式,比如 50、50%、50%p,當(dāng)為數(shù)值時,表示在當(dāng)前View的左上角,即原點(diǎn)處加上50px,做為起始縮放點(diǎn);如果是50%,表示在當(dāng)前控件的左上角加上自己寬度的50%做為起始點(diǎn);如果是50%p,那么就是表示在當(dāng)前的左上角加上父控件寬度的50%做為起始點(diǎn)x軸坐標(biāo)。)
你可以通過分配Interpolator來確定一段時間內(nèi)如何應(yīng)用轉(zhuǎn)換。 Android包含幾個Interpolator子類,可以指定各種速度曲線:例如,AccelerateInterpolator指示轉(zhuǎn)換開始慢速加速。 每個都有一個可以在XML中應(yīng)用的屬性值。
將此XML保存為項目的res / anim /目錄中的hyperspace_jump.xml,以下代碼將引用它并將其應(yīng)用于布局中的ImageView對象。
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
作為startAnimation()的替代方法,您可以使用Animation.setStartTime()定義動畫的開始時間,然后使用View.setAnimation()將動畫分配給View。有關(guān)XML語法,可用標(biāo)簽和屬性的更多信息,請參閱Animation Resources。注意:無論動畫如何移動或調(diào)整大小,保存動畫的視圖的邊界將不會自動調(diào)整以適應(yīng)。 即使如此,動畫仍將被繪制超出其視圖的邊界,不會被剪輯。 但是,如果動畫超過父視圖的邊界,則會進(jìn)行裁剪。
Drawable Animation
可繪制的動畫可以讓你一個接一個地加載一系列的Drawable資源來創(chuàng)建動畫。 這是一種傳統(tǒng)的動畫,它的意義是創(chuàng)建一系列不同的圖像,按順序播放,像一卷電影。 AnimationDrawable類是可繪制動畫的基礎(chǔ)。
雖然你可以使用AnimationDrawable類API在代碼中定義動畫的框架,但使用單個XML文件來完成更加簡單,該XML文件列出了構(gòu)成動畫的框架。 這種動畫的XML文件屬于您的Android項目的res / drawable /目錄。 在這種情況下,指令是動畫每幀的順序和持續(xù)時間。
<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>
這個動畫只運(yùn)行三幀。 通過將列表的android:oneshot屬性設(shè)置為true,它將循環(huán)一次,然后停止并保持最后一幀。如果設(shè)置為false,則動畫將循環(huán)。將此XML保存為項目的res / drawable /目錄中的rocket_thrust.xml(編者按:上面已經(jīng)介紹過了,有興趣的可以去翻一翻),可以將其作為背景圖像添加到View,然后調(diào)用播放。 下面是一個示例,其中將動畫添加到ImageView中,然后在觸摸屏幕時進(jìn)行動畫:
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.drawable.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);
}
注意:在Activity的onCreate()方法中,AnimationDrawable上調(diào)用的start()方法無法調(diào)用,因為AnimationDrawable尚未完全附加到窗口。 如果要立即播放動畫,而不需要交互,那么你可能希望在Activity中的onWindowFocusChanged()方法中調(diào)用它,當(dāng)Android將你的窗口置于焦點(diǎn)時,該動畫將被調(diào)用。