Android動(dòng)畫(huà)學(xué)習(xí)(一):幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)

前言

在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)容:

  1. alpha(透明度)
  2. scale(縮放)
  3. translation(平移)
  4. 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)簽相似。

  1. 數(shù)值單位為px.
  2. 百分比表示為自身View大小的百分比
  3. 百分?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à)文件夾:animanimator,這兩個(gè)動(dòng)畫(huà)文件夾是有所區(qū)別的:

  1. anim文件夾一般用來(lái)存放補(bǔ)間動(dòng)畫(huà)或者幀動(dòng)畫(huà)。
  2. animator文件夾下一般用來(lái)存放屬性動(dòng)畫(huà)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容