android動畫總結(jié)

視圖動畫

實現(xiàn)原理:每次繪制視圖時View所在的ViewGroup中的drawChild函數(shù)獲取View的Animation的Transformation值控嗜,然后調(diào)用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀。如果動畫沒有完成,就繼續(xù)調(diào)用invalidate()函數(shù),啟動下次繪制來驅(qū)動動畫,從而完成整個動畫的繪制评雌。

透明動畫
AlphaAnimation aa = new AlphaAnimation(0, 1); //透明變化范圍
aa.setDuration(1000); //持續(xù)時間
view.startAnimation(aa);
旋轉(zhuǎn)動畫
//構(gòu)造方法參數(shù)為旋轉(zhuǎn)起始角度和旋轉(zhuǎn)中心點坐標
//RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
//旋轉(zhuǎn)中心可直接設(shè)為定值,也可通過設(shè)置參考系選定直焙,這里設(shè)置為自身中心
RotateAnimation ra = new RotateAnimation(0, 360, 
    RotateAnimation.RELATIVE_TO_SELF, 0.5F,
    RotateAnimation.RELATIVE_TO_SELF, 0.5F); 
ra.setDuration(1000); //持續(xù)時間
view.startAnimation(ra);
位移動畫
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300); //起始坐標和結(jié)束坐標
ta.setDuration(1000); //持續(xù)時間
view.startAnimation(ta);
縮放動畫
//構(gòu)造方法參數(shù)為x軸在動畫開始和結(jié)束時柳骄、Y軸在動畫開始和結(jié)束時的伸縮比例,1為正常大小
ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2); 
/**
  *另有8參數(shù)構(gòu)造方法箕般,可設(shè)置縮放的參考位置
  *ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2,
  *    Animation.RELATIVE_TO_SELF, 0.5F,
  *    Animation.RELATIVE_TO_SELF, 0.5F);; 
  */
sa.setDuration(1000); //持續(xù)時間
view.startAnimation(sa);
動畫集合
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
//
AlphaAnimation aa = new AlphaAnimation(0, 1); 
aa.setDuration(1000); 
as.addAnimation(aa);
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300); 
ta.setDuration(1000); 
as.addAnimation(ta);
//
view.startAnimation(as);

屬性動畫

ObjectAnimator
/**
  *通過靜態(tài)工廠類直接返回一個ObjectAnimator對象耐薯,參數(shù)包括:
  *view對象、對象的屬性名丝里、屬性變化值
  *該屬性必須有g(shù)et和set方法
  */
ObjectAnimator animator = ObjectAnimator.ofFloat(
    view,
    "translationX",
    300);
animator.setDuration(300);
animator.start();

一些常用的可以直接使用屬性動畫的屬性值:

  • translationX和translationY:作為增量曲初,控制View對象相對它所在布局容器的左上角坐標偏移的位置。
  • rotation杯聚、rotationX和rotationY:控制View對象圍繞支點進行2D和3D旋轉(zhuǎn)臼婆。
  • scaleX和scaleY:這兩個屬性控制著View對象圍繞它的支點進行2D縮放。
  • pivotX和pivotY:這兩個屬性控制著View的支點位置幌绍,默認為View的中心點颁褂。
  • x和y:描述View對象在它所在容器的最終位置。
  • alpha:表示View對象的透明度傀广,默認為1(不透明)颁独,0表示完全透明。

對于沒有g(shù)et伪冰、set方法的屬性誓酒,可以自定義屬性類,來間接給屬性增加get贮聂、set方法靠柑;或者通過ValueAnimator來實現(xiàn)。
封裝屬性類方法示例:

private static class WrapperView {
  
    private View mTarget;

    public WrapperView(View target) {
        mTarget = target;
    }
    public int getWidth() {
        return mTarget.getLayoutParams().width;
    }
    public void setWidth(int width) {
        mTarget.getLayoutParams().width = width;
        mTarget.requestLayout();
    }
}

ViewWrapper wrapper = new ViewWrapper(mButton);
ObjectAnimator.ofInt(wrapper, "width", 500).setDuration(5000).start();
PropertyValuesHolder

類似視圖動畫中的AnimationSet吓懈,在屬性動畫中歼冰,如果針對一個對象的多個屬性,要同時作用多種動畫耻警,可以使用PropertyValuesHolder來實現(xiàn)隔嫡。

PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvh1, pvh2, pvh3).setDuration(1000).start();
AnimatorSet

對同一對象作用多個屬性動畫效果甸怕,除了PropertyValuesHolder,還可以通過AnimatorSet實現(xiàn)畔勤,同時也能實現(xiàn)更為精確的順序控制。顯示同上PropertyValuesHolder同樣的效果扒磁,用AnimatorSet實現(xiàn)代碼如下:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0, 1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0, 1f);
AnimatorSet set = new AnimatorSet();
set.setDuration(1000);
set.playTogther(animator1, animator2, animator3);
set.start();

屬性動畫中庆揪,AnimatorSet正是通過playTogether()、playSequentially()妨托、play()缸榛、with()、before()兰伤、after()這些方法控制多個動畫協(xié)同工作方式内颗。

ValueAnimator

ValueAnimator本身不提供任何動畫效果,而是產(chǎn)生有一定規(guī)律的數(shù)字敦腔,讓調(diào)用者來控制動畫的實現(xiàn)過程均澳,使用方法如下:

ValueAnimator animator = ValueAnimator.ofFloat(0, 100);
animator.setTarget(view);
animator.setDuration(1000).start();
animator.addUpdateListener(new AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Float value = (Float)animation.getAnimatedValue();
        //TODO use the value
    }
});
動畫事件監(jiān)聽

一個完整動畫具有Start、Repeat符衔、End找前、Cancel四個過程,通過Android提供了接口判族,可以很方便的監(jiān)聽四個事件:

ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0.5f);
anim.addListener(new AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation){
    }
    @Override
    public void onAnimationRepeat(Animator animation){
    }
    @Override
    public void onAnimationEnd(Animator animation){
    }
    @Override
    public void onAnimationCancel(Animator animation){
    }
});

//也可以只監(jiān)聽某一項事件
anim.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
    }
});
xml中使用屬性動畫

屬性動畫同視圖動畫一樣躺盛,也可以直接寫在XML中,如下:

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:propertyName="scaleX"
    android:valueFrom="1.0"
    android:valueTo="2.0"
    android:valueType="floatType">
</objectAnimator>

在程序中使用:

public void scaleX(View view) {
    Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scalex);
    anim.setTarget(mMv);
    anim.start();
}

Android布局動畫

所謂布局動畫是指用在ViewGroup上形帮,給ViewGroup增加View時添加一個動畫過渡效果槽惫。
最簡單的布局動畫是在ViewGroup的XML中,使用以下代碼打開布局動畫:

android:animateLayoutChanges="true"

此方法只是使用android默認過渡動畫辩撑,且無法替換這個效果界斜。
一般使用LayoutAnimationController類來自定義一個子view的過渡效果,以下是給子view添加縮放的動畫效果:

LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
// 設(shè)置過渡動畫
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa.setDuration(2000);
//設(shè)置布局動畫的顯示屬性合冀,第二個參數(shù)為delay時間
LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5f);
/**
 *delay不為0時可以設(shè)置子view的顯示順序锄蹂,
 *LayoutAnimationController.ORDER_NORMAL——順序
 *LayoutAnimationController.ORDER_RANDOM——隨機
 *LayoutAnimationController.ORDER_REVERSE——反序
 */
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
//為ViewGroup設(shè)置布局動畫
ll.setLayoutAnimation(lac);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市水慨,隨后出現(xiàn)的幾起案子得糜,更是在濱河造成了極大的恐慌,老刑警劉巖晰洒,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朝抖,死亡現(xiàn)場離奇詭異,居然都是意外死亡谍珊,警方通過查閱死者的電腦和手機治宣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侮邀,你說我怎么就攤上這事坏怪。” “怎么了绊茧?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵铝宵,是天一觀的道長。 經(jīng)常有香客問我华畏,道長鹏秋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任亡笑,我火速辦了婚禮侣夷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仑乌。我一直安慰自己百拓,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布晰甚。 她就那樣靜靜地躺著耐版,像睡著了一般。 火紅的嫁衣襯著肌膚如雪压汪。 梳的紋絲不亂的頭發(fā)上粪牲,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音止剖,去河邊找鬼腺阳。 笑死,一個胖子當著我的面吹牛穿香,可吹牛的內(nèi)容都是我干的亭引。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼皮获,長吁一口氣:“原來是場噩夢啊……” “哼焙蚓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洒宝,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤购公,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雁歌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏浩,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年靠瞎,在試婚紗的時候發(fā)現(xiàn)自己被綠了比庄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片求妹。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佳窑,靈堂內(nèi)的尸體忽然破棺而出制恍,到底是詐尸還是另有隱情,我是刑警寧澤神凑,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布净神,位于F島的核電站,受9級特大地震影響耙厚,放射性物質(zhì)發(fā)生泄漏强挫。R本人自食惡果不足惜岔霸,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一薛躬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呆细,春花似錦型宝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坑夯,卻和暖如春岖寞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柜蜈。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工仗谆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淑履。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓隶垮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秘噪。 傳聞我的和親對象是個殘疾皇子狸吞,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容