前言
在Android開(kāi)發(fā)中會(huì)經(jīng)常使用到動(dòng)畫(huà),本次對(duì)Android中的動(dòng)畫(huà)做一個(gè)簡(jiǎn)單總結(jié)備忘。
Android中的動(dòng)畫(huà)主要分為三類:幀動(dòng)畫(huà),補(bǔ)間動(dòng)畫(huà)和屬性動(dòng)畫(huà),本片內(nèi)容會(huì)對(duì)幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)進(jìn)行簡(jiǎn)單說(shuō)明總結(jié)。
系列文章:
Android動(dòng)畫(huà)學(xué)習(xí)(一):幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)
Android動(dòng)畫(huà)學(xué)習(xí)(二):基本屬性動(dòng)畫(huà)
Android動(dòng)畫(huà)學(xué)習(xí)(三):自定義屬性動(dòng)畫(huà)
一、幀動(dòng)畫(huà)
幀動(dòng)畫(huà)是將一張張單獨(dú)的圖片以連續(xù)的方式播放而形成的視覺(jué)動(dòng)畫(huà)。實(shí)現(xiàn)這種動(dòng)畫(huà)主要依靠UI圖片資源。
幀動(dòng)畫(huà)的實(shí)現(xiàn)一般是依靠xml文件來(lái)實(shí)現(xiàn),利用xml來(lái)實(shí)現(xiàn)不僅可以方便的定義資源文件,還能夠有利于動(dòng)畫(huà)的復(fù)用。
示例代碼如下,我們首先定義一個(gè)名為test_frame_anim2.xml的幀動(dòng)畫(huà):
<animation-list
android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/arrow_right"
android:duration="1000" />
<item
android:drawable="@drawable/icon_warning"
android:duration="1000" />
<item
android:drawable="@drawable/icon_left_arrow"
android:duration="1000" />
</animation-list>
當(dāng)我們調(diào)用時(shí)可以通過(guò)設(shè)置ImageView控件的圖片resource實(shí)現(xiàn)動(dòng)畫(huà)的設(shè)置,示例代碼如下:
/**
* 逐幀動(dòng)畫(huà)
*/
private fun setFrameAnimation() {
imageAnimFrame1?.setImageResource(R.drawable.test_frame_anim2)
val animationDrawable1 = imageAnimFrame1?.drawable as AnimationDrawable?
animationDrawable1?.start()
}
二、補(bǔ)間動(dòng)畫(huà)
1. 基本內(nèi)容
常用的補(bǔ)間動(dòng)畫(huà)主要包括四種基本內(nèi)容:
- alpha(透明度)
- scale(縮放)
- translation(平移)
- rotation(旋轉(zhuǎn))
補(bǔ)間動(dòng)畫(huà)可以采用上述四種中的一種或多種效果進(jìn)行組合。
2. 實(shí)現(xiàn)
補(bǔ)間動(dòng)畫(huà)的實(shí)現(xiàn)主要包括有兩種實(shí)現(xiàn)方式:XML實(shí)現(xiàn)和代碼實(shí)現(xiàn)。
1. xml實(shí)現(xiàn)
補(bǔ)間動(dòng)畫(huà)的xml文件一般放置在res/anim/文件夾下面,我們?cè)诖宋募A下面新定義一個(gè)xml動(dòng)畫(huà):test_flash_anim1.xml,代碼如下(效果隨便寫(xiě)的,可以看下xml參數(shù)):
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="1000"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toAlpha="1.0" />
<scale
android:duration="1000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
<translate
android:duration="3000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="50%"
android:toYDelta="50%" />
<rotate
android:duration="2000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="180" />
</set>
然后調(diào)用如下代碼即可以調(diào)用xml動(dòng)畫(huà):
private fun setFlashXMLAnim(view: View?) {
val animation: Animation =
AnimationUtils.loadAnimation(DemoApplication.mContext, R.anim.test_flash_anim1)
view?.startAnimation(animation)
}
對(duì)xml中部分屬性做下簡(jiǎn)單說(shuō)明:
1. alpha
| 標(biāo)簽 | 說(shuō)明 |
|---|---|
| duration | 時(shí)長(zhǎng),單位ms |
| fromAlpha | 起始透明度,范圍0-1 |
| toAlpha | 結(jié)束透明度,范圍0-1 |
| interpolator | 動(dòng)畫(huà)插值器,控制動(dòng)畫(huà)的速度 |
2. scale
| 標(biāo)簽 | 說(shuō)明 |
|---|---|
| fromXScale | 起始X比例大小,當(dāng)值為1.0時(shí)表示原大小 |
| fromYScale | 起始Y比例大小,當(dāng)值為1.0時(shí)表示原大小 |
| toXScale | 結(jié)束X比例大小,當(dāng)值為1.0時(shí)表示原大小 |
| toYScale | 結(jié)束Y比例大小,當(dāng)值為1.0時(shí)表示原大小 |
| pivotX | 縮放起點(diǎn)X軸坐標(biāo),三種取值:數(shù)值,百分比,百分?jǐn)?shù)P。起始點(diǎn)都是以左上角為標(biāo)準(zhǔn)。數(shù)值單位為px;百分比為當(dāng)前view的百分比大?。话俜?jǐn)?shù)p為父控件寬度的百分比大小。 |
| pivotY | 縮放起始點(diǎn)Y軸坐標(biāo),取值同pivotX。 |
| duration | 動(dòng)畫(huà)時(shí)長(zhǎng),單位ms。 |
3. translate
| 標(biāo)簽 | 說(shuō)明 |
|---|---|
| fromXDelta | 起始X軸位置 |
| fromYDelta | 起始Y軸位置 |
| toXDelta | 結(jié)束X軸位置 |
| toYDelta | 結(jié)束Y軸位置 |
| duration | 動(dòng)畫(huà)時(shí)長(zhǎng),單位ms |
translate的位置標(biāo)簽的取值支持三種取值方式:數(shù)值,百分?jǐn)?shù),百分?jǐn)?shù)P,和scale標(biāo)簽相似。
- 數(shù)值單位為px.
- 百分比表示為自身View大小的百分比
- 百分?jǐn)?shù)P表示為父View大小的百分比
4. rotate
| 標(biāo)簽 | 說(shuō)明 |
|---|---|
| fromDegrees | 起始角度,單位度。 |
| toDegrees | 結(jié)束角度,單位度。 |
| pivotX | 旋轉(zhuǎn)中心的X軸位置,同樣有數(shù)值,百分比,百分?jǐn)?shù)P三種取值 |
| pivotY | 旋轉(zhuǎn)中心Y軸位置,取值同pivotX。 |
| duration | 動(dòng)畫(huà)時(shí)長(zhǎng),單位ms。 |
| fillAfter | 動(dòng)畫(huà)執(zhí)行完后是否保持最后狀態(tài),取true保持 |
5. set
set標(biāo)簽是可以將多個(gè)動(dòng)畫(huà)組合。
2. 代碼實(shí)現(xiàn)
代碼實(shí)現(xiàn)補(bǔ)間動(dòng)畫(huà)主要是依靠類Animation。這個(gè)類具有多個(gè)子類:AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation。我們可以創(chuàng)建這幾個(gè)子類對(duì)象實(shí)現(xiàn)對(duì)應(yīng)的補(bǔ)間動(dòng)畫(huà),以透明度動(dòng)畫(huà)為例,代碼如下:
private fun setFlashAlphaAnim(view: View?) {
var animation: AlphaAnimation = AlphaAnimation(0f, 1.0f)
animation.duration = 1000
view?.startAnimation(animation)
}
除此之外,補(bǔ)間動(dòng)畫(huà)還有一些其他常見(jiàn)的方法:
| 方法 | 說(shuō)明 |
|---|---|
| fillAfter | 設(shè)置在動(dòng)畫(huà)執(zhí)行結(jié)束后的狀態(tài),設(shè)置為false則返回動(dòng)畫(huà)初始狀態(tài),設(shè)置為true保持動(dòng)畫(huà)執(zhí)行結(jié)束之后的狀態(tài) |
| repeatMode | 動(dòng)畫(huà)重復(fù)模式,常見(jiàn)的有REVERSE和RESTART兩種。REVERSE表示反向執(zhí)行動(dòng)畫(huà),RESTART表示重新執(zhí)行動(dòng)畫(huà)。 |
| repeatCount | 動(dòng)畫(huà)重復(fù)次數(shù) |
備注
在Android Studio編輯時(shí)能夠看到當(dāng)前的項(xiàng)目工程有著兩個(gè)動(dòng)畫(huà)文件夾:anim和animator,這兩個(gè)動(dòng)畫(huà)文件夾是有所區(qū)別的:
-
anim文件夾一般用來(lái)存放補(bǔ)間動(dòng)畫(huà)或者幀動(dòng)畫(huà)。 -
animator文件夾下一般用來(lái)存放屬性動(dòng)畫(huà)。