一、概述
Android的animation由四種類型組成:alpha、scale、translate、rotate,對應(yīng)android官方文檔地址:《Animation Resources》
alpha漸變透明度動畫效果
scale漸變尺寸伸縮動畫效果
translate畫面轉(zhuǎn)換位置移動動畫效果
rotate畫面轉(zhuǎn)移旋轉(zhuǎn)動畫效果
下面我們逐個講講每個標(biāo)簽的屬性及用法。
動作定義文件應(yīng)該存放在res/anim文件夾下,訪問時采用R.anim.XXX.xml的方式,位置如圖:
二、scale標(biāo)簽——調(diào)節(jié)尺寸
scale標(biāo)簽是縮放動畫,可以實(shí)現(xiàn)動態(tài)調(diào)控件尺寸的效果,有下面幾個屬性:
android:fromXScale起始的X方向上相對自身的縮放比例,浮點(diǎn)值,比如1.0代表自身無變化,0.5代表起始時縮小一倍,2.0代表放大一倍;
android:toXScale結(jié)尾的X方向上相對自身的縮放比例,浮點(diǎn)值;
android:fromYScale起始的Y方向上相對自身的縮放比例,浮點(diǎn)值,
android:toYScale結(jié)尾的Y方向上相對自身的縮放比例,浮點(diǎn)值;
android:pivotX縮放起點(diǎn)X軸坐標(biāo),可以是數(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)。(具體意義,后面會舉例演示)
android:pivotY縮放起點(diǎn)Y軸坐標(biāo),取值及意義跟android:pivotX一樣。
下面看一個實(shí)例,當(dāng)scale里的屬性這樣設(shè)置時,效果會怎樣呢:
[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ù)值時(50)
這個控件,寬度和高度都是從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ù)時(50%)
下面再看看當(dāng)pivotX、pivotY取百分?jǐn)?shù)的時候,起始點(diǎn)又在哪里?
上面我們講了,pivotX的值,當(dāng)取50%時,表示在原點(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時
前面說過,當(dāng)取值在百分?jǐn)?shù)后面加上一個字母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類是所有動畫(scale、alpha、translate、rotate)的基類,這里以scale標(biāo)簽為例,講解一下,Animation類所具有的屬性及意義。關(guān)于Animation類的官方文檔位置為:《Animation》
android:duration動畫持續(xù)時間,以毫秒為單位
android:fillAfter如果設(shè)置為true,控件動畫結(jié)束時,將保持動畫最后時的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動畫結(jié)束時,還原到開始動畫前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同,都是在動畫結(jié)束時,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類型,即回放時的動作。
android:interpolator設(shè)定插值器,其實(shí)就是指定的動作效果,比如彈跳效果等,不在這小節(jié)中講解,后面會單獨(dú)列出一單講解。
對于android:duration,就不再講解了,就是動畫的持續(xù)時長,以毫秒為單位,下面看看android:fillAfter和android:fillBefore
(1)android:fillAfter:保持動畫結(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時的效果,這兩個的標(biāo)簽的效果完全相同。
(3)、android:repeatMode="restart /reverse" ?設(shè)定回放類型
[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動畫開始的透明度,從0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
android:toAlpha動畫結(jié)束時的透明度,也是從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動畫持續(xù)時間,以毫秒為單位
android:fillAfter如果設(shè)置為true,控件動畫結(jié)束時,將保持動畫最后時的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動畫結(jié)束時,還原到開始動畫前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同,都是在動畫結(jié)束時,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類型,即回放時的動作。
android:interpolator設(shè)定插值器,其實(shí)就是指定的動作效果,比如彈跳效果等,不在這小節(jié)中講解,后面會單獨(dú)列出一單講解。
與scale標(biāo)簽意義一樣,就不再綴述。
android:fromDegrees開始旋轉(zhuǎn)的角度位置,正值代表順時針方向度數(shù),負(fù)值代碼逆時針方向度數(shù)
android:toDegrees結(jié)束時旋轉(zhuǎn)到的角度位置,正值代表順時針方向度數(shù),負(fù)值代碼逆時針方向度數(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度逆時針旋轉(zhuǎn)650度 ? ? ? ? ? ? ? ? ? ? ? ? ? ?圍繞自身從0度順時針旋轉(zhuǎn)650度
android:fromDegrees="0" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? android:fromDegrees="0"
android:toDegrees="-650" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?android:toDegrees="650"
android:duration動畫持續(xù)時間,以毫秒為單位
android:fillAfter如果設(shè)置為true,控件動畫結(jié)束時,將保持動畫最后時的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動畫結(jié)束時,還原到開始動畫前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同,都是在動畫結(jié)束時,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類型,即回放時的動作。
android:interpolator設(shè)定插值器,其實(shí)就是指定的動作效果,比如彈跳效果等,不在這小節(jié)中講解,后面會單獨(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動畫持續(xù)時間,以毫秒為單位
android:fillAfter如果設(shè)置為true,控件動畫結(jié)束時,將保持動畫最后時的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動畫結(jié)束時,還原到開始動畫前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同,都是在動畫結(jié)束時,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類型,即回放時的動作。
android:interpolator設(shè)定插值器,其實(shí)就是指定的動作效果,比如彈跳效果等,不在這小節(jié)中講解,后面會單獨(dú)列出一單講解。
與scale標(biāo)簽意義一樣,就不再綴述。
前面我們講解了各個標(biāo)簽動畫的意義及用法,但他們都是獨(dú)立對控件起作用,假設(shè)我現(xiàn)在想上面的textView控件做一個動畫——從小到大,旋轉(zhuǎn)出場,而且透明度也要從0變成1,即下面的這個效果,該怎么辦?
這就需要對指定的控件定義動作合集,Set標(biāo)簽就可以將幾個不同的動作定義成一個組;
set標(biāo)簽自已是沒有屬性的,他的屬性都是從Animation繼承而來,但當(dāng)它們用于Set標(biāo)簽時,就會對Set標(biāo)簽下的所有子控件都產(chǎn)生作用。
屬性有:(從Animation類繼承的屬性)
android:duration動畫持續(xù)時間,以毫秒為單位
android:fillAfter如果設(shè)置為true,控件動畫結(jié)束時,將保持動畫最后時的狀態(tài)
android:fillBefore如果設(shè)置為true,控件動畫結(jié)束時,還原到開始動畫前的狀態(tài)
android:fillEnabled與android:fillBefore 效果相同,都是在動畫結(jié)束時,將控件還原到初始化狀態(tài)
android:repeatCount重復(fù)次數(shù)
android:repeatMode重復(fù)類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類型,即回放時的動作。
android:interpolator設(shè)定插值器,其實(shí)就是指定的動作效果,比如彈跳效果等,不在這小節(jié)中講解,后面會單獨(dú)列出一單講解。
與scale標(biāo)簽意義一樣,就不再綴述。
上面這個效果,所對應(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í)例——如何將動畫XML文件應(yīng)用于控件中
上面我僅僅是列出了每個標(biāo)簽及其屬性的意義及應(yīng)用之后的效果演示,但上面是如何將定義動畫的xml應(yīng)用到textView控件中的卻遲遲沒說,這一小節(jié),就以scale動畫為例,講述如何將定義好的scle動作添加到指定控件中。
先看最終效果圖:
1、新建工程、新建scale動畫文件(scaleanim.xml)
新建一個工程,并且在res文件夾下,新建一個anim文件夾,然后再新建一個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)通過scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scaleanim);從XML文件中獲取動畫
(2)利用startAnimation將動畫傳遞給指定控件顯示。
http://blog.csdn.net/harvic880925/article/details/39996643