Android動畫復習

最近工作比較清閑眠饮,所以想系統(tǒng)的復習和學習下自己比較短缺的知識硫椰,所以。骆莹。颗搂。

程序運行效果圖:

Android動畫主要包含補間動畫(Tween)View Animation、幀動畫(Frame)Drawable Animation幕垦、以及屬性動畫Property Animation丢氢。下面依次介紹一下各個動畫傅联。

1. 補間動畫(Tween)

Tween動畫,通過對View的內(nèi)容進行一系列的圖形變換 (包括平移疚察、縮放蒸走、旋轉(zhuǎn)、改變透明度)來實現(xiàn)動畫效果貌嫡。動畫效果的定義可以采用XML來做也可以采用編碼來做比驻。Tween動畫有4種類型:

動畫的類型

Xml定義動畫使用的配置節(jié)點

編碼定義動畫使用的類

漸變透明度動畫效果

AlphaAnimation

漸變尺寸縮放動畫效果

ScaleAnimation

畫面位置移動動畫效果

TranslateAnimation

畫面旋轉(zhuǎn)動畫效果

RotateAnimation

我們可以為每一個動畫設置動畫插入器,Android自帶的幾種動畫插入器:

AccelerateInterpolator

加速岛抄,開始時慢中間加速

DecelerateInterpolator

減速别惦,開始時快然后減速

AccelerateDecelerateInterolator

先加速后減速,開始結束時慢夫椭,中間加速

AnticipateInterpolator

反向掸掸,先向相反方向改變一段再加速播放

AnticipateOvershootInterpolator

反向加超越,先向相反方向改變蹭秋,再加速播放扰付,會超出目的值然后緩慢移動至目的值

BounceInterpolator

跳躍,快到目的值時值會跳躍仁讨,如目的值100悯周,后面的值可能依次為85,77陪竿,70,80屠橄,90族跛,100

CycleIinterpolator

循環(huán),動畫循環(huán)一定次數(shù)锐墙,值的改變?yōu)橐徽液瘮?shù):Math.sin(2* mCycles* Math.PI* input)

LinearInterpolator

線性礁哄,線性均勻改變

OvershottInterpolator

超越,最后超出目的值然后緩慢改變到目的值

1.1預備知識:

抽象類Animation是一個實現(xiàn)androidUI界面動畫效果的API溪北,Animation是補間動畫的基類桐绒,它的直接子類AlphaAnimation, RotateAnimation, ScaleAnimation, TranslateAnimation,AnimationSet,提供了一系列的動畫效果,可以進行淡入淡出之拨、旋轉(zhuǎn)茉继、縮放、動畫集等蚀乔,這些效果可以應用在絕大多數(shù)的控件中烁竭。

1.2AlphaAnimation實現(xiàn)淡入淡出的動畫效果

//方式一通過代碼的方式定義透明度動畫

AnimationalphaAnimation=newAlphaAnimation(1, (float) 0.1);

alphaAnimation.setDuration(3000);//設置動畫持續(xù)時間為3秒

alphaAnimation.setFillAfter(true);//設置動畫結束后保持當前的位置(即不返回到動畫開始前的位置)

imgShow.startAnimation(alphaAnimation);

//方式二通過在xml中定義透明度動畫

第一步:定義xml動畫文件:alpha.xml

"1.0"encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

android:fromAlpha="1.0"

android:toAlpha="0.1"

android:duration="3000"

android:fillAfter="true"

android:repeatCount="2">

第二步:加載xml動畫文件并將其設置到指定的View

AnimationalphaAnimation2=AnimationUtils.loadAnimation(this, R.anim.alpha);//加載Xml文件中的動畫

imgShow.startAnimation(alphaAnimation2);

程序運行效果圖:

1.3.RotateAnimation實現(xiàn)旋轉(zhuǎn)的動畫效果

主要屬性及說明:

repeatCount 重復次數(shù)

fromDegrees為動畫起始時物件的角度:

當角度為負數(shù)——表示逆時針旋轉(zhuǎn)

當角度為正數(shù)——表示順時針旋轉(zhuǎn)

(負數(shù)fromDegrees——toDegrees正數(shù):順時針旋轉(zhuǎn))

(負數(shù)fromDegrees——toDegrees負數(shù):逆時針旋轉(zhuǎn))

(正數(shù)fromDegrees——toDegrees正數(shù):順時針旋轉(zhuǎn))

(正數(shù)fromDegrees——toDegrees負數(shù):逆時針旋轉(zhuǎn))

toDegrees屬性為動畫結束時物件旋轉(zhuǎn)的角度可以大于360度

pivotX,pivotY 為動畫相對于物件的X、Y坐標的開始位.說明:以上兩個屬性值從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置吉挣。

實例:

//方式一通過代碼的方式定義旋轉(zhuǎn)動畫

AnimationrotateAnimation=newRotateAnimation(0, 45);

rotateAnimation.setDuration(3000);//設置動畫持續(xù)時間為3秒

rotateAnimation.setFillAfter(true);//設置動畫結束后保持當前的位置(即不返回到動畫開始前的位置)

imgShow.startAnimation(rotateAnimation);

//方式二通過在xml中定義旋轉(zhuǎn)動畫

第一步:定義xml動畫文件:rotate.xml

"1.0"encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

android:fromDegrees="0"

android:toDegrees="45"

android:duration="300"

android:fillAfter="true">

第二步:加載xml動畫文件并將其設置到指定的View

Animation rotateAnimation2=AnimationUtils.loadAnimation(this, R.anim.rotate);//加載Xml文件中的動畫

imgShow.startAnimation(rotateAnimation2);

程序運行效果圖:

1.4.ScaleAnimation實現(xiàn)縮放動畫效果

主要屬性及說明:

fromXScale(浮點型)屬性為動畫起始時X坐標上的縮放尺寸

fromYScale(浮點型)屬性為動畫起始時Y坐標上的縮放尺寸

toXScale(浮點型)屬性為動畫結束時X坐標上的縮放尺寸

toYScale(浮點型)屬性為動畫結束時Y坐標上的縮放尺寸

說明: 以上四種屬性值

0.0表示收縮到?jīng)]有

1.0表示正常無縮放

值小于1.0表示收縮

值大于1.0表示放大

pivotX(浮點型)屬性為動畫相對于物件的X坐標的開始位置

pivotY(浮點型)屬性為動畫相對于物件的Y坐標的開始位置

說明:

以上兩個屬性值從0%-100%中取值

50%為物件的X或Y方向坐標上的中點位置

duration(長整型)屬性為動畫持續(xù)時間派撕。說明: 時間以毫秒為單位

fillAfter(布爾型)屬性當設置為true婉弹,該動畫轉(zhuǎn)化在動畫結束后被應用

實例:

//方式一通過代碼的方式定義縮放動畫

AnimationscaleAnimation=newScaleAnimation(0.5f, 1.0f,1.0f, 1.0f);

scaleAnimation.setDuration(2000);//設置動畫持續(xù)時間為3秒

scaleAnimation.setFillAfter(true);//設置動畫結束后保持當前的位置(即不返回到動畫開始前的位置)

scaleAnimation.setRepeatCount(3);

imgShow.startAnimation(scaleAnimation);

//方式二通過在xml中定義縮放動畫

第一步:定義xml動畫文件:scale.xml

"1.0"encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

android:fromXScale="0.5"

android:toXScale="1.0"

android:fromYScale="1.0"

android:toYScale="1.0"

android:duration="3000"

android:fillAfter="true">

第二步:加載xml動畫文件并將其設置到指定的View

AnimationscaleAnimation2=AnimationUtils.loadAnimation(this, R.anim.scale);//加載Xml文件中的動畫imgShow.startAnimation(scaleAnimation2);

程序運行效果圖:

1.5. TranslateAnimation實現(xiàn)位移動畫效果

//方式一通過代碼的方式定義位移動畫

AnimationtranslateAnimation=newTranslateAnimation(0, 100, 0, 0);

translateAnimation.setDuration(3000);//設置動畫持續(xù)時間為3秒

translateAnimation.setInterpolator(this, android.R.anim.cycle_interpolator);//設置動畫插入器

translateAnimation.setFillAfter(true);//設置動畫結束后保持當前的位置(即不返回到動畫開始前的位置)

imgShow.startAnimation(translateAnimation);

//方式二通過在xml中定義位移動畫

第一步:定義xml動畫文件:translate.xml

"1.0"encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

android:fromXDelta="0"

android:toXDelta="260"

android:fromYDelta="0"

android:toYDelta="600"

android:duration="3600"

android:fillAfter="true"

android:interpolator="@android:anim/accelerate_decelerate_interpolator">

第二步:加載xml動畫文件并將其設置到指定的View

AnimationtranslateAnimation2=AnimationUtils.loadAnimation(this, R.anim.translate);//加載Xml文件中的動畫

imgShow.startAnimation(translateAnimation2);

程序運行效果圖:

1.6.AnimationSet實現(xiàn)多種動畫混合效果

定義動畫集主要用到了AnimationSet類,該類可以添加多個補間動畫啊终吼。

//方式一通過代碼的方式定義動畫集

AnimationSetanimationSet=newAnimationSet(true);//定義一個動畫集镀赌,并設定所有的動畫使用一個動畫插入其

Animation translateAnimation2=AnimationUtils.loadAnimation(this, R.anim.translate);//加載Xml文件中的動畫

AnimationalphaAnimation2=AnimationUtils.loadAnimation(this, R.anim.alpha);//加載Xml文件中的動畫

Animation rotateAnimation2=AnimationUtils.loadAnimation(this, R.anim.rotate);//加載Xml文件中的動畫

Animation scaleAnimation2=AnimationUtils.loadAnimation(this, R.anim.scale);//加載Xml文件中的動畫

animationSet.addAnimation(translateAnimation2);

animationSet.addAnimation(alphaAnimation2);

animationSet.addAnimation(rotateAnimation2);

animationSet.addAnimation(scaleAnimation2);

animationSet.setInterpolator(this, android.R.anim.anticipate_interpolator);

imgShow.startAnimation(animationSet);

//方式二在xml文件中設置動畫集合

第一步:定義xml動畫文件:animset.xml

"1.0"encoding="utf-8"?>

"http://schemas.android.com/apk/res/android">

android:fromAlpha="1.0"

android:toAlpha="0.1"

android:duration="3000"

android:fillAfter="true"

android:repeatCount="2">

android:fromDegrees="0"

android:toDegrees="45"

android:duration="300"

android:fillAfter="true">

android:fromXScale="0.5"

android:toXScale="1.0"

android:fromYScale="1.0"

android:toYScale="1.0"

android:duration="3000"

android:fillAfter="true">

android:fromXDelta="0"

android:toXDelta="260"

android:fromYDelta="0"

android:toYDelta="600"

android:duration="3600"

android:fillAfter="true"

android:interpolator="@android:anim/accelerate_decelerate_interpolator">

第二步:加載xml動畫文件并將其設置到指定的View

AnimationSetanimationSet2=(AnimationSet) AnimationUtils.loadAnimation(this, R.anim.animset);

程序運行效果圖:

提示:雖然可以通過代碼的方式定義動畫,但是Android官方還是建議在xml中定義動畫效果际跪,這樣可做到最大程度上的解耦商佛,方便項目的后期維護。

2. 幀動畫(Frame)

Frame動畫垫卤,即順序播放事先做好的圖像威彰,跟放膠片電影類似。

開發(fā)步驟:

(1)把準備好的圖片放進項目res/ drawable下穴肘。

(2)在項目的drawable文件夾下面定義動畫XML文件歇盼,文件名稱可以自定義。當然也可以采用編碼方式定義動畫效果(使用AnimationDrawable類)评抚。

(3)為View控件綁定動畫效果豹缀。調(diào)用代表動畫的AnimationDrawable的start()方法開始動畫。

實例:

framelist.xml

"1.0"encoding="utf-8"?>

"http://schemas.android.com/apk/res/android"

android:oneshot="false">

"@drawable/zzlx1"android:duration="200"/>

"@drawable/zzlx2"android:duration="200"/>

"@drawable/zzlx3"android:duration="200"/>

"@drawable/zzlx4"android:duration="200"/>

"@drawable/zzlx5"android:duration="200"/>

"@drawable/zzlx6"android:duration="200"/>

"@drawable/zzlx7"android:duration="200"/>

"@drawable/zzlx8"android:duration="200"/>

代碼分析:

上面的XML就定義了一個Frame動畫慨代,其包含8幀動畫邢笙,8幀動畫中分別應用了drawable中的8張圖片:zzlx1、zzlx2侍匙、zzlx3....氮惯,每幀動畫持續(xù)200毫秒。android:oneshot屬性如果為true想暗,表示動畫只播放一次停止在最后一幀上妇汗,如果設置為false表示動畫循環(huán)播放。

在Xml中定義好幀動畫之后就可以將其設置到View上了说莫,請看下面代碼:

//第一步將animation-list設置為ImageView的背景

imgShow.setBackgroundResource(R.drawable.framelist);

//第二步獲取ImagView的背景并將其轉(zhuǎn)換成AnimationDrawable

AnimationDrawableanimationDrawable=(AnimationDrawable)imgShow.getBackground();

//第三步開始播放動畫

animationDrawable.start();

提示:

有一點需要強調(diào)的是:啟動Frame動畫的代碼animationDrawable.start();不能應用在OnCreate()方法中杨箭,因為在OnCreate()中AnimationDrawable還沒有完全的與ImageView綁定。在OnCreate()中啟動動畫储狭,只能看到第一張圖片互婿。這里在觸摸事件中實現(xiàn)的

程序運行效果圖:

3. 屬性動畫(Property Animation)

使用屬性動畫注意事項:

1). object必須要提供setXxx方法,如果動畫的時候沒有傳遞初始值辽狈,那么還要提供getXxx方法慈参,因為系統(tǒng)要去拿xxx屬性的初始值(如果這條不滿足,程序直接Crash)

2). object的setXxx對屬性xxx所做的改變必須能夠通過某種方法反映出來刮萌,比如會帶來ui的改變啥的(如果這條不滿足懂牧,動畫無效果但不會Crash)

以上條件缺一不可。

3).對應沒有getXxx和setXxx方法或有getXxx和setXxx方法但和getXxx和setXxx方法設置的屬性不是我們想要的效果如,我們對Button的width屬性做動畫沒有效果僧凤?這是因為Button內(nèi)部雖然提供了getWidth和setWidth方法畜侦,但是這個setWidth方法并不是改變視圖的大小,它是TextView新添加的方法躯保,View是沒有這個setWidth方法的旋膳,由于Button繼承了TextView,所以Button也就有了setWidth方法.getWidth的確是獲取View的寬度的途事,而setWidth是TextView和其子類的專屬方法验懊,它的作用不是設置View的寬度,而是設置TextView的最大寬度和最小寬度的尸变,這個和TextView的寬度不是一個東西义图,具體來說,TextView的寬度對應Xml中的android :layout_width屬性召烂,而TextView還有一個屬性android :width碱工,這個android:width屬性就對應了TextView的setWidth方法。這里給出一種解決方法及使用包裝類:用一個類來包裝原始對象奏夫,間接為其提供get和set方法怕篷。如下:

/**

*包裝類用于封裝View的with、height,

*你可以通過getXxx以及setXxx方法設置View的寬和高

*@authorjph

*/

classWrapView{

privateViewview;

privateintwidth;

privateintheight;

publicWrapView(View view){

this.view=view;

}

publicintgetWidth() {

returnview.getLayoutParams().width;

}

publicvoidsetWidth(intwidth) {

this.width = width;

view.getLayoutParams().width=width;//修改View的高度

view.requestLayout();//刷新View的布局

}

publicintgetHeight() {

returnview.getLayoutParams().height;

}

publicvoidsetHeight(intheight) {

this.height=height;

view.getLayoutParams().height = height;

view.requestLayout();

}

}

實例:

packagecom.jph.anim;

importandroid.animation.ObjectAnimator;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.ImageView;

/**

* 屬性動畫實例

* @author jph

*

*/

public class PropertyActivity ?extends ?Activity {

privateImageView imgShow;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.property);

imgShow=(ImageView)findViewById(R.id.imgShow);

}

publicvoidplay(View view) {

switch(view.getId()) {

caseR.id.btnStart:

ObjectAnimator animator=ObjectAnimator.ofInt(newWrapView(imgShow),

"width",10);

animator.setDuration(2000);//設置動畫持續(xù)的時間

animator.setRepeatCount(2);//設置動畫重復的次數(shù)

animator.start();//開啟動畫

default:

break;

}

}

/**

* 包裝類用于封裝View的with酗昼、height,

* 你可以通過getXxx以及setXxx方法設置View的寬和高

* @author jph

*/

classWrapView{

privateView view;

privateintwidth;

privateintheight;

publicWrapView(View view){

this.view=view;

}

publicintgetWidth() {

returnview.getLayoutParams().width;

}

publicvoidsetWidth(intwidth) {

this.width = width;

view.getLayoutParams().width=width;//修改View的高度

view.requestLayout();//刷新View的布局

}

publicintgetHeight() {

returnview.getLayoutParams().height;

}

publicvoidsetHeight(intheight) {

this.height=height;

view.getLayoutParams().height = height;

view.requestLayout();

}

}

}

程序運行效果圖:


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廊谓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麻削,更是在濱河造成了極大的恐慌蒸痹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛哟,死亡現(xiàn)場離奇詭異叠荠,居然都是意外死亡,警方通過查閱死者的電腦和手機竖共,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俺祠,“玉大人公给,你說我怎么就攤上這事≈┰” “怎么了淌铐?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔫缸。 經(jīng)常有香客問我腿准,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任吐葱,我火速辦了婚禮街望,結果婚禮上,老公的妹妹穿的比我還像新娘弟跑。我一直安慰自己灾前,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布孟辑。 她就那樣靜靜地躺著哎甲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饲嗽。 梳的紋絲不亂的頭發(fā)上炭玫,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音貌虾,去河邊找鬼吞加。 笑死,一個胖子當著我的面吹牛酝惧,可吹牛的內(nèi)容都是我干的榴鼎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晚唇,長吁一口氣:“原來是場噩夢啊……” “哼巫财!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哩陕,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤平项,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悍及,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闽瓢,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年心赶,在試婚紗的時候發(fā)現(xiàn)自己被綠了扣讼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缨叫,死狀恐怖椭符,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耻姥,我是刑警寧澤销钝,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站琐簇,受9級特大地震影響蒸健,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一似忧、第九天 我趴在偏房一處隱蔽的房頂上張望渣叛。 院中可真熱鬧,春花似錦橡娄、人聲如沸诗箍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碌更,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匠童,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工塑顺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汤求,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓严拒,卻偏偏與公主長得像扬绪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裤唠,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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