1. 程式人生 > >android 之動畫 (二) 插值器

android 之動畫 (二) 插值器

插值器

首先要了解為什麼需要插值器,因為在補間動畫中,我們一般只定義關鍵幀(首幀或尾幀),然後由系統自動生成中間幀,生成中間幀的這個過程可以成為“插值”。插值器定義了動畫變化的速率,提供不同的函式定義變化值相對於時間的變化規則,可以定義各種各樣的非線性變化函式,比如加速、減速等。下面是幾種常見的插值器:

Interpolator物件 資源ID 功能作用
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator
先加速再減速
AccelerateInterpolator @android:anim/accelerate_interpolator 加速
AnticipateInterpolator @android:anim/anticipate_interpolator 先回退一小步然後加速前進
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 在上一個基礎上超出終點一小步再回到終點
BounceInterpolator @android:anim/bounce_interpolator 最後階段彈球效果
CycleInterpolator @android:anim/cycle_interpolator 週期運動
DecelerateInterpolator @android:anim/decelerate_interpolator 減速
LinearInterpolator @android:anim/linear_interpolator
勻速
OvershootInterpolator @android:anim/overshoot_interpolator 快速到達終點並超出一小步最後回到終點

插值器使用法:

<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>

個性化插值器:

如果系統提供的插值器不能滿足需要,可以通過修改插值器的屬性優化,比如修改AnticipateInterpolator的加速速率,調整CycleInterpolator的迴圈次數等。

常見的插值器可調整的屬性:

<accelerateDecelerateInterpolator> 無

<accelerateInterpolator> android:factor 浮點值,加速速率,預設為1

<anticipateInterploator> android:tension 浮點值,起始點後退的張力、拉力數,預設為2

<anticipateOvershootInterpolator> android:tension 同上 android:extraTension 浮點值,拉力的倍數,預設為1.5(2 * 1.5)

<bounceInterpolator> 無

<cycleInterplolator> android:cycles 整數值,迴圈的個數,預設為1

<decelerateInterpolator> android:factor 浮點值,減速的速率,預設為1

<linearInterpolator> 無

<overshootInterpolator> 浮點值,超出終點後的張力、拉力,預設為2

使用修改插值器屬性法

在/res/anim下建立一個XML檔案(以修改overshootInterpolator屬性為例)命名為my_overshoot_interpolator.xml

<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:tension="7.0"/>

引用到自定義的插值器

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@anim/my_overshoot_interpolator"
    .../>

自定義插值器

如果以上的修改系統插值器屬性仍無法滿足需要,可以自定義插值器。