一漱挎、動畫分類及簡介
View Animation 視圖動畫
Property Animation 屬性動畫
1.View Animation包括Tween Animation(補(bǔ)間動畫)和Frame Animation(逐幀動畫);
Tween Animation:通過對場景里的對象不斷做圖像變換(平移切平、縮放轨淌、旋轉(zhuǎn))產(chǎn)生動畫效果迂烁,即是一種漸變動畫;
Frame Animation:順序播放事先做好的圖像递鹉,是一種畫面轉(zhuǎn)換動畫盟步。
2.Property Animation:屬性動畫,通過動態(tài)地改變對象的屬性從而達(dá)到動畫效果躏结,屬性動畫為API 11新特性却盘。
3.差別
View Animation僅能對指定的控件做動畫,而Property Animator是通過改變控件某一屬性值來做動畫的媳拴。
補(bǔ)間動畫雖能對控件做動畫黄橘,但并沒有改變控件內(nèi)部的屬性值(比如 位移后點(diǎn)擊事件沒有響應(yīng),因為補(bǔ)間動畫將這個view重新繪制屈溉,而對應(yīng)的屬性位置還是沒有改變)塞关。而Property Animator則是恰恰相反,Property Animator是通過改變控件內(nèi)部的屬性值來達(dá)到動畫效果的
二子巾、View Animation 視圖動畫
1.逐幀動畫: (幀動畫使用很簡單帆赢,但很容易出現(xiàn)OOM。盡量避免使用較大較多的圖片线梗。)
2.補(bǔ)間動畫的四種變換
平移動畫 <translate> TranslateAnimation 移動View
縮放動畫 <scale> ScaleAnimation 放大或縮小View
旋轉(zhuǎn)動畫 <rotate> RotateAnimation 旋轉(zhuǎn)View
透明度動畫 <alpha> AlphaAnimation 改變View的透明度
<set> 標(biāo)簽標(biāo)示動畫集合椰于,對應(yīng)于AnimationSet類
3.其他
LayoutAnimation
LayoutAnimation作用于ViewGroup,更經(jīng)常的是作用于ListView仪搔,使得每個子Item都具有此動畫
定義
Activity的切換效果主要用到overridePendingTransition(int enterAnim, int exitAnim)
這個方法瘾婿,需要注意的是,這個方法需要在startActivity(Intent intent)
或者finish()
之后被調(diào)用才能生效烤咧。
三偏陪、屬性動畫
原理:在規(guī)定的時間內(nèi),修改對象的屬性(對象中對應(yīng)的字段)的值煮嫌,以此實(shí)現(xiàn)該對象在屬性上的動畫效果笛谦。
1.ValueAnimator
控制 值 的變化,之后 手動 賦值給對象的屬性立膛,從而實(shí)現(xiàn)動畫
ValueAnimator.ofInt(int... values) -- 整型數(shù)值 內(nèi)置IntEvaluator估值器
ValueAnimator.ofFloat(float... values) -- 浮點(diǎn)型數(shù)值 內(nèi)置FloatEvaluator估值器
ValueAnimator.ofObject(TypeEvaluator evaluator, Object... values) -- 自定義對象類型 需要自定義TypeEvaluator
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {}
evaluator實(shí)現(xiàn)了 TypeEvaluator 接口揪罕,然后重寫了 evaluate() 方法梯码。該方法的三個參數(shù)意義如下:
fraction:表示動畫完成度,據(jù)此計算當(dāng)前動畫的值
startValue:動畫初始值
endValue:動畫結(jié)束值
那么 evalute() 方法的返回值就是返回當(dāng)前動畫的值好啰。
實(shí)例
//2. 在傳入?yún)?shù)之間平滑過渡
//如下則0平滑過渡到3
ValueAnimator animator = ValueAnimator.ofInt(0,3);
//如下傳入多個參數(shù)轩娶,效果則為0->5,5->3,3->10
//ValueAnimator animator = ValueAnimator.ofInt(0,5,3,10);
//設(shè)置動畫的基礎(chǔ)屬性
animator.setDuration(5000);//播放時長
animator.setStartDelay(300);//延遲播放
animator.setRepeatCount(0);//重放次數(shù)
animator.setRepeatMode(ValueAnimator.RESTART);
//重放模式
//ValueAnimator.START:正序
//ValueAnimator.REVERSE:倒序
//設(shè)置更新監(jiān)聽
//值 改變一次,該方法就執(zhí)行一次
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//獲取改變后的值
int currentValue = (int) animation.getAnimatedValue();
//輸出改變后的值
Log.d("onAnimationUpdate", "-----: " + currentValue);
//改變后的值發(fā)賦值給對象的屬性值
view.setproperty(currentValue);
//刷新視圖
view.requestLayout();
}
});
//啟動動畫
animator.start();
2.ObjectAnimator
ValueAnimator只是對 值 進(jìn)行平滑的動畫過渡框往;ObjectAnimator直接對 任意對象的任意屬性 進(jìn)行動畫操作鳄抒,如View的alpha屬性
ValueAnimator需要我們?yōu)閷ο髮傩允謩淤x值;ObjectAnimator會為對象屬性自動賦值
實(shí)例
ObjectAnimator animator = ObjectAnimator.ofFloat(Object object, String property, float ....values);
//ObjectAnimator animator = ObjectAnimator.ofInt(Object object, String property, int ....values);
//ObjectAnimator animator = ObjectAnimator.ofObject(Object object, String property, TypeEvaluator evaluator,Object....values);
// 以ofFloat為例 參數(shù)說明:
// Object object:需要操作的對象
// String property:需要操作的對象的屬性
// float ....values:動畫初始值 & 結(jié)束值(不固定長度)
// 若是兩個參數(shù)a,b椰弊,則動畫效果則是從屬性的a值到b值
// 若是三個參數(shù)a,b,c许溅,則則動畫效果則是從屬性的a值到b值再到c值
// 至于如何從初始值 過渡到 結(jié)束值,同樣是由估值器決定秉版,此處ObjectAnimator.ofFloat()是有系統(tǒng)內(nèi)置的浮點(diǎn)型估值器FloatEvaluator贤重,同ValueAnimator講解
//動畫基本屬性
anim.setDuration(500);
anim.setStartDelay(500);
anim.setRepeatCount(0);
anim.setRepeatMode(ValueAnimator.RESTART);
animator.start();
// 啟動動畫
注意:ObjectAnimator內(nèi)部的工作機(jī)制是去尋找這個屬性名對應(yīng)的get和set方法,通過二者賦值清焕。ObjectAnimator 類針對的是任意對象 & 任意屬性值并蝗,并不是單單針對于View對象
如果需要采用ObjectAnimator 類實(shí)現(xiàn)動畫效果,那么需要操作的對象就必須有該屬性的set() & get()
四秸妥、插值器與估值器
插值器(TimeInterpolator):它的作用是根據(jù)時間流逝的百分比來計算出當(dāng)前屬性值改變的百分比滚停,系統(tǒng)預(yù)置的有LinearInterpolator、AccelerateDecelerateInterpolator粥惧、DecelerateIntepolator等
實(shí)例
Animation alphaAnimation = new AlphaAnimation(1,0);
// 步驟2:創(chuàng)建透明度動畫的對象 & 設(shè)置動畫效果
alphaAnimation.setDuration(3000);
Interpolator overshootInterpolator = new OvershootInterpolator();
// 步驟3:創(chuàng)建對應(yīng)的插值器類對象
alphaAnimation.setInterpolator(overshootInterpolator);
// 步驟4:給動畫設(shè)置插值器
mButton.startAnimation(alphaAnimation);
// 步驟5:播放動畫
估值器(TypeEvaluator):它的作用是根據(jù)當(dāng)前屬性改變的百分比來計算改變后的屬性值(插值器得出的值)键畴,系統(tǒng)預(yù)置的有IntEvaluator(針對整型屬性)、FloatEvaluator(針對浮點(diǎn)型屬性)和ArgbEvaluator(針對Color屬性)
簡單地說突雪,TimeInterpolator實(shí)現(xiàn)類:插值器-描述動畫的變化速率
TypeEvaluator實(shí)現(xiàn)類:估值器-描述 屬性值 變化的具體數(shù)值
五起惕、屬性動畫的監(jiān)聽
屬性動畫也提供了監(jiān)聽器用于監(jiān)聽動畫的過程,如下所示:
public static interface AnimatorListener{
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
此外挂签,系統(tǒng)還提供了AnimatorListenerAdapter這個類疤祭,我們可以通過這個類來有選擇的實(shí)現(xiàn)上面的接口方法盼产,而不必實(shí)現(xiàn)所有的方法饵婆。
另外,還有一個AnimatorUpdateListener接口戏售,如下所示:
public static interface AnimatorUpdateListener{
void onAnimationUpdate(ValueAnimator animation);
}
這個監(jiān)聽器會監(jiān)聽整個動畫過程侨核,每播放一幀,onAnimationUpdate()就會被調(diào)用一次灌灾。