一亿汞、概述
Android的animation由四種類(lèi)型組成:alpha、scale揪阿、translate疗我、rotate,對(duì)應(yīng)android官方文檔地址:《Animation Resources》
alpha漸變透明度動(dòng)畫(huà)效果
scale漸變尺寸伸縮動(dòng)畫(huà)效果
translate畫(huà)面轉(zhuǎn)換位置移動(dòng)動(dòng)畫(huà)效果
rotate畫(huà)面轉(zhuǎn)移旋轉(zhuǎn)動(dòng)畫(huà)效果
下面我們逐個(gè)講講每個(gè)標(biāo)簽的屬性及用法吴裤。
動(dòng)作定義文件應(yīng)該存放在res/anim文件夾下溺健,訪(fǎng)問(wèn)時(shí)采用R.anim.XXX.xml的方式麦牺,位置如圖:
二、scale標(biāo)簽——調(diào)節(jié)尺寸
scale標(biāo)簽是縮放動(dòng)畫(huà)剖膳,可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)控件尺寸的效果,有下面幾個(gè)屬性:
android:fromXScale起始的X方向上相對(duì)自身的縮放比例岭辣,浮點(diǎn)值吱晒,比如1.0代表自身無(wú)變化,0.5代表起始時(shí)縮小一倍沦童,2.0代表放大一倍仑濒;
android:toXScale結(jié)尾的X方向上相對(duì)自身的縮放比例叹话,浮點(diǎn)值;
android:fromYScale起始的Y方向上相對(duì)自身的縮放比例躏精,浮點(diǎn)值渣刷,
android:toYScale結(jié)尾的Y方向上相對(duì)自身的縮放比例,浮點(diǎn)值矗烛;
android:pivotX縮放起點(diǎn)X軸坐標(biāo)辅柴,可以是數(shù)值、百分?jǐn)?shù)瞭吃、百分?jǐn)?shù)p 三種樣式碌嘀,比如 50、50%歪架、50%p股冗,當(dāng)為數(shù)值時(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)催束。(具體意義集峦,后面會(huì)舉例演示)
android:pivotY縮放起點(diǎn)Y軸坐標(biāo),取值及意義跟android:pivotX一樣抠刺。
下面看一個(gè)實(shí)例塔淤,當(dāng)scale里的屬性這樣設(shè)置時(shí),效果會(huì)怎樣呢:
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50"
android:pivotY="50"
android:duration="700"/>
(1)速妖、pivotX取值數(shù)值時(shí)(50)
這個(gè)控件高蜂,寬度和高度都是從0放大到1.4倍,起始點(diǎn)坐標(biāo)在控件左上角(坐標(biāo)原點(diǎn))罕容,向x軸正方向和y軸正方向都加上50像素妨马;
根據(jù)pivotX,pivotY的意義,控件的左上角即為控件的坐標(biāo)原點(diǎn)杀赢,這里的起始點(diǎn)是在控件的原點(diǎn)的基礎(chǔ)上向X軸和Y軸各加上50px丐吓,做為起始點(diǎn)蚜退,如下圖中圖二所示
圖一 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖二
(2)帮寻、pivotX取值百分?jǐn)?shù)時(shí)(50%)
下面再看看當(dāng)pivotX逛拱、pivotY取百分?jǐn)?shù)的時(shí)候月幌,起始點(diǎn)又在哪里芹壕?
上面我們講了淆两,pivotX的值师崎,當(dāng)取50%時(shí),表示在原點(diǎn)坐標(biāo)的基礎(chǔ)上加上的自己寬度的50%汇歹,看看效果:
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700"/>
縮放位置大小仍然從0-1.4屁擅,只改變pivotX和pivotY;起始點(diǎn)位置如下圖中圖二所示:
圖一 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖二
(3)、pivotX取值50%p時(shí)
前面說(shuō)過(guò)产弹,當(dāng)取值在百分?jǐn)?shù)后面加上一個(gè)字母p派歌,就表示,取值的基數(shù)是父控件痰哨,即在原點(diǎn)的基礎(chǔ)上增加的值是父標(biāo)簽的百分值胶果。
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%p"
android:pivotY="50%p"
android:duration="700"/>
效果圖,及起始點(diǎn)坐標(biāo)圖如下所示:
Animation類(lèi)是所有動(dòng)畫(huà)(scale早抠、alpha、translate撬讽、rotate)的基類(lèi)蕊连,這里以scale標(biāo)簽為例,講解一下游昼,Animation類(lèi)所具有的屬性及意義甘苍。關(guān)于Animation類(lèi)的官方文檔位置為:《Animation》
android:duration動(dòng)畫(huà)持續(xù)時(shí)間,以毫秒為單位
android:fillAfter如果設(shè)置為true酱床,控件動(dòng)畫(huà)結(jié)束時(shí)羊赵,將保持動(dòng)畫(huà)最后時(shí)的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動(dòng)畫(huà)結(jié)束時(shí),還原到開(kāi)始動(dòng)畫(huà)前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同扇谣,都是在動(dòng)畫(huà)結(jié)束時(shí)昧捷,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類(lèi)型,有reverse和restart兩個(gè)值罐寨,reverse表示倒序回放靡挥,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果鸯绿。因?yàn)檫@里的意義是重復(fù)的類(lèi)型跋破,即回放時(shí)的動(dòng)作。
android:interpolator設(shè)定插值器瓶蝴,其實(shí)就是指定的動(dòng)作效果毒返,比如彈跳效果等,不在這小節(jié)中講解舷手,后面會(huì)單獨(dú)列出一單講解拧簸。
對(duì)于android:duration,就不再講解了男窟,就是動(dòng)畫(huà)的持續(xù)時(shí)長(zhǎng)盆赤,以毫秒為單位贾富,下面看看android:fillAfter和android:fillBefore
(1)android:fillAfter:保持動(dòng)畫(huà)結(jié)束的狀態(tài)
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700"
android:fillAfter="true"
/>
(2)android:fillBefore ?還原初始化狀態(tài)
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700"
android:fillBefore="true"
/>
android:fillBefore="true" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? android:fillEnable="true"
上面順便列出了,當(dāng)僅設(shè)定fillEanble為true時(shí)的效果牺六,這兩個(gè)的標(biāo)簽的效果完全相同颤枪。
(3)、android:repeatMode="restart /reverse" ?設(shè)定回放類(lèi)型
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700"
android:fillBefore="true"
android:repeatCount="1"
android:repeatMode="restart"
/>
androidRepeatMode設(shè)為restart ? ? ? ? ? ? ? ? ? ? ??androidRepeatMode設(shè)為reverse
三淑际、alpha標(biāo)簽——調(diào)節(jié)透明度
android:fromAlpha動(dòng)畫(huà)開(kāi)始的透明度,從0.0 --1.0 庸追,0.0表示全透明霍骄,1.0表示完全不透明
android:toAlpha動(dòng)畫(huà)結(jié)束時(shí)的透明度,也是從0.0 --1.0 淡溯,0.0表示全透明读整,1.0表示完全不透明
使用示例:
[html]view plaincopy
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="3000"
android:fillBefore="true">
android:duration動(dòng)畫(huà)持續(xù)時(shí)間咱娶,以毫秒為單位
android:fillAfter如果設(shè)置為true米间,控件動(dòng)畫(huà)結(jié)束時(shí),將保持動(dòng)畫(huà)最后時(shí)的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動(dòng)畫(huà)結(jié)束時(shí)膘侮,還原到開(kāi)始動(dòng)畫(huà)前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同屈糊,都是在動(dòng)畫(huà)結(jié)束時(shí),將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類(lèi)型琼了,有reverse和restart兩個(gè)值逻锐,reverse表示倒序回放,restart表示重新放一遍雕薪,必須與repeatCount一起使用才能看到效果昧诱。因?yàn)檫@里的意義是重復(fù)的類(lèi)型,即回放時(shí)的動(dòng)作所袁。
android:interpolator設(shè)定插值器盏档,其實(shí)就是指定的動(dòng)作效果,比如彈跳效果等燥爷,不在這小節(jié)中講解蜈亩,后面會(huì)單獨(dú)列出一單講解。
與scale標(biāo)簽意義一樣前翎,就不再綴述稚配。
android:fromDegrees開(kāi)始旋轉(zhuǎn)的角度位置药有,正值代表順時(shí)針?lè)较蚨葦?shù),負(fù)值代碼逆時(shí)針?lè)较蚨葦?shù)
android:toDegrees結(jié)束時(shí)旋轉(zhuǎn)到的角度位置,正值代表順時(shí)針?lè)较蚨葦?shù)愤惰,負(fù)值代碼逆時(shí)針?lè)较蚨葦?shù)
android:pivotX縮放起點(diǎn)X軸坐標(biāo),可以是數(shù)值赘理、百分?jǐn)?shù)宦言、百分?jǐn)?shù)p 三種樣式,比如 50商模、50%奠旺、50%p,具體意義已在scale標(biāo)簽中講述施流,這里就不再重講
android:pivotY縮放起點(diǎn)Y軸坐標(biāo)响疚,可以是數(shù)值、百分?jǐn)?shù)瞪醋、百分?jǐn)?shù)p 三種樣式忿晕,比如 50、50%银受、50%p
[html]view plaincopy
android:fromDegrees="0"
android:toDegrees="-650"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true">
圍繞自身從0度逆時(shí)針旋轉(zhuǎn)650度 ? ? ? ? ? ? ? ? ? ? ? ? ? ?圍繞自身從0度順時(shí)針旋轉(zhuǎn)650度
android:fromDegrees="0" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? android:fromDegrees="0"
android:toDegrees="-650" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?android:toDegrees="650"
android:duration動(dòng)畫(huà)持續(xù)時(shí)間,以毫秒為單位
android:fillAfter如果設(shè)置為true宾巍,控件動(dòng)畫(huà)結(jié)束時(shí)咕幻,將保持動(dòng)畫(huà)最后時(shí)的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動(dòng)畫(huà)結(jié)束時(shí),還原到開(kāi)始動(dòng)畫(huà)前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同顶霞,都是在動(dòng)畫(huà)結(jié)束時(shí)肄程,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類(lèi)型,有reverse和restart兩個(gè)值选浑,reverse表示倒序回放蓝厌,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果鲜侥。因?yàn)檫@里的意義是重復(fù)的類(lèi)型褂始,即回放時(shí)的動(dòng)作。
android:interpolator設(shè)定插值器描函,其實(shí)就是指定的動(dòng)作效果崎苗,比如彈跳效果等,不在這小節(jié)中講解舀寓,后面會(huì)單獨(dú)列出一單講解胆数。
與scale標(biāo)簽意義一樣,就不再綴述互墓。
android:fromXDelta起始點(diǎn)X軸坐標(biāo),可以是數(shù)值判莉、百分?jǐn)?shù)豆挽、百分?jǐn)?shù)p 三種樣式,比如 50券盅、50%帮哈、50%p,具體意義已在scale標(biāo)簽中講述锰镀,這里就不再重講
android:fromYDelta起始點(diǎn)Y軸從標(biāo)娘侍,可以是數(shù)值、百分?jǐn)?shù)泳炉、百分?jǐn)?shù)p 三種樣式憾筏;
android:toXDelta結(jié)束點(diǎn)X軸坐標(biāo)
android:toYDelta結(jié)束點(diǎn)Y軸坐標(biāo)
[html]view plaincopy
android:fromXDelta="0"
android:toXDelta="-80"
android:fromYDelta="0"
android:toYDelta="-80"
android:duration="2000"
android:fillBefore="true">
android:duration動(dòng)畫(huà)持續(xù)時(shí)間花鹅,以毫秒為單位
android:fillAfter如果設(shè)置為true氧腰,控件動(dòng)畫(huà)結(jié)束時(shí),將保持動(dòng)畫(huà)最后時(shí)的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動(dòng)畫(huà)結(jié)束時(shí)翠胰,還原到開(kāi)始動(dòng)畫(huà)前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同容贝,都是在動(dòng)畫(huà)結(jié)束時(shí),將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類(lèi)型之景,有reverse和restart兩個(gè)值斤富,reverse表示倒序回放,restart表示重新放一遍锻狗,必須與repeatCount一起使用才能看到效果满力。因?yàn)檫@里的意義是重復(fù)的類(lèi)型,即回放時(shí)的動(dòng)作轻纪。
android:interpolator設(shè)定插值器油额,其實(shí)就是指定的動(dòng)作效果,比如彈跳效果等刻帚,不在這小節(jié)中講解潦嘶,后面會(huì)單獨(dú)列出一單講解。
與scale標(biāo)簽意義一樣崇众,就不再綴述掂僵。
前面我們講解了各個(gè)標(biāo)簽動(dòng)畫(huà)的意義及用法顷歌,但他們都是獨(dú)立對(duì)控件起作用锰蓬,假設(shè)我現(xiàn)在想上面的textView控件做一個(gè)動(dòng)畫(huà)——從小到大,旋轉(zhuǎn)出場(chǎng)眯漩,而且透明度也要從0變成1芹扭,即下面的這個(gè)效果麻顶,該怎么辦?
這就需要對(duì)指定的控件定義動(dòng)作合集舱卡,Set標(biāo)簽就可以將幾個(gè)不同的動(dòng)作定義成一個(gè)組辅肾;
set標(biāo)簽自已是沒(méi)有屬性的,他的屬性都是從Animation繼承而來(lái)轮锥,但當(dāng)它們用于Set標(biāo)簽時(shí)宛瞄,就會(huì)對(duì)Set標(biāo)簽下的所有子控件都產(chǎn)生作用。
屬性有:(從Animation類(lèi)繼承的屬性)
android:duration動(dòng)畫(huà)持續(xù)時(shí)間交胚,以毫秒為單位
android:fillAfter如果設(shè)置為true,控件動(dòng)畫(huà)結(jié)束時(shí)盈电,將保持動(dòng)畫(huà)最后時(shí)的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動(dòng)畫(huà)結(jié)束時(shí)蝴簇,還原到開(kāi)始動(dòng)畫(huà)前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同,都是在動(dòng)畫(huà)結(jié)束時(shí)匆帚,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類(lèi)型熬词,有reverse和restart兩個(gè)值,reverse表示倒序回放吸重,restart表示重新放一遍互拾,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類(lèi)型嚎幸,即回放時(shí)的動(dòng)作颜矿。
android:interpolator設(shè)定插值器,其實(shí)就是指定的動(dòng)作效果嫉晶,比如彈跳效果等骑疆,不在這小節(jié)中講解,后面會(huì)單獨(dú)列出一單講解替废。
與scale標(biāo)簽意義一樣箍铭,就不再綴述。
上面這個(gè)效果椎镣,所對(duì)應(yīng)的XML代碼為:
[html]view plaincopy
android:duration="3000"
android:fillAfter="true">
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"/>
android:fromDegrees="0"
android:toDegrees="720"
android:pivotX="50%"
android:pivotY="50%"/>
七诈火、實(shí)例——如何將動(dòng)畫(huà)XML文件應(yīng)用于控件中
上面我僅僅是列出了每個(gè)標(biāo)簽及其屬性的意義及應(yīng)用之后的效果演示,但上面是如何將定義動(dòng)畫(huà)的xml應(yīng)用到textView控件中的卻遲遲沒(méi)說(shuō)状答,這一小節(jié)冷守,就以scale動(dòng)畫(huà)為例,講述如何將定義好的scle動(dòng)作添加到指定控件中剪况。
先看最終效果圖:
1教沾、新建工程、新建scale動(dòng)畫(huà)文件(scaleanim.xml)
新建一個(gè)工程译断,并且在res文件夾下授翻,新建一個(gè)anim文件夾,然后再新建一個(gè)scaleanim.xml文件,結(jié)構(gòu)如圖所示:
scaleanim.xml的代碼為:(從TextView中心點(diǎn)堪唐,從0放大到1.4倍巡语,反復(fù)一次,最后還原到初始化狀態(tài))
[html]view plaincopy
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700"
android:fillBefore="true"
android:repeatCount="1"
android:repeatMode="restart"
/>
[html]view plaincopy
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.harvic.animation_demo.MainActivity">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dip"
android:text="scale?animation"/>
android:id="@+id/tv"
android:layout_width="100dip"
android:layout_height="200dip"
android:background="#ff00ff"
android:text="@string/hello_world"
android:layout_gravity="center_horizontal"/>
[java]view plaincopy
publicclassMainActivityextendsActivity?{
Button?scaleBtn?;
Animation?scaleAnimation;
TextView?tv;
@Override
protectedvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scaleAnimation?=?AnimationUtils.loadAnimation(this,?R.anim.scaleanim);
scaleBtn?=?(Button)findViewById(R.id.btn_animation);
tv?=(TextView)findViewById(R.id.tv);
scaleBtn.setOnClickListener(newView.OnClickListener()?{
@Override
publicvoidonClick(View?v)?{
//?TODO?Auto-generated?method?stub
tv.startAnimation(scaleAnimation);
}
});
}
}
(1)通過(guò)scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scaleanim);從XML文件中獲取動(dòng)畫(huà)
(2)利用startAnimation將動(dòng)畫(huà)傳遞給指定控件顯示。
http://blog.csdn.net/harvic880925/article/details/39996643