Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> ValueAnimator 中文翻譯

ValueAnimator 中文翻譯

編輯:關於Android編程

類概述

這個類提供一個簡單的時間引擎來運行動畫,它將計算動畫的值並將值設置到對象上。
有一個簡單的所有動畫使用的動畫脈沖,它運行在一個自定義(譯注:custom)的handler中,以確保屬性變化發生在UI線程中。
默認的,ValueAnimator通過使用AccelerateDecelerateInterpolator類來使用非線性的時間插值,這個插值器讓動畫展加速進入並且減速退出(譯注1)。可以通過setInterpolator(TimeInterpolator)來設置插值器以改變這種行為。
譯注1
這裡說加速進入、減速退出,要注意的是AccelerateDecelerateInterpolator這個插值器是在開始和結束時慢,在中間加速。

//cos(π~2π)/2+0.5,函數是單調遞增的,開始和結束慢
public float getInterpolation(float input) {
            return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
        }

動畫可以通動代畫或資源文件創建,下面是用資源文件創建ValueAnimator的例子(譯注2)

也可以通過 PropertyValuesHolder和Keyframe 這兩種資源標簽的組合,來創建多步動畫。注意,你可以給每一個keyframe 都聲明明確的分數(0到1),以這個分數來決定keyframe的值在在整個動畫區間的何時到達。或者,你不寫這個分數的話,所有的keyframes 將在整個區間平均分布。


    
        
        
        
    

譯注2:
這裡說的不清楚,在
《Declaring Animations in XML》中有說明,在安卓3.1以上,應該把屬性動畫的xml文件放到res/animator/目錄,我放到/anim下面有錯誤提示了。
上面這一個animator,放到目錄下,用AnimatorInflater.loadAnimator加載,然後運行時,它會在0時為1,然後降到0.2時值為0.4,也就是說keyframe控制fraction時值為value。

開發指南

關於ValueAnimator的更多信息,看開發向導《Property Animation》

嵌套類

類型 介紹 interface ValueAnimator.AnimatorUpdateListener
實現這個接口可以將其添加為一個ValueAnimator實例的更新監聽器,可以在當前幀的值計算出來時,收到回調

常量

類型 介紹 int INFINITE
值為:-1 (0xffffffff)
用於 setRepeatCount(int),表示無限地重復動畫
int RESTART
值為:1 (0x00000001)
當動畫到結尾時,如果repeatCount(譯注:重復次數)無限或者為正,動畫會重頭開始
int REVERSE
值為:2 (0x00000002)
當動畫到結尾時,如果repeatCount無限或者為正,動畫會在每一次循環時反向

構造方法

ValueAnimator()
創建一個新的對象,默認的構造方法主要在內部調用,帶參數的工廠方法更通用。

公共方法

返回類型 介紹 void addUpdateListener(ValueAnimator.AnimatorUpdateListener listener)
給一組監聽器中加上一個監聽器,它們將在動畫周期中收到更新事件回調
void cancel()
取消動畫
和end()不同,cancel()方法會讓動畫停在它的tracks(譯注:軌跡)上。發送onAnimationCancel(Animator),再發送onAnimationEnd(Animator)。
這個方法必須在運行動畫的線程中調用。
ValueAnimator clone()
克隆(譯注4)
void end()
結束動畫。將動畫設為動畫屬性的結尾值,然後調用監聽器的onAnimationEnd(Animator)方法。
這個方法必須在運行動畫的線程中調用。
float getAnimatedFraction()
返回當前動畫分數,它的值是是流逝的幀數除以總的幀數,被動畫中最近的幀所使用。
Object getAnimatedValue()
當只有一個屬性在進行動畫時,返回ValueAnimator計算的最新的值。只有在動畫運行時,這個值才是合理的。這個只讀屬性的主要目的是在調用onAnimationUpdate(ValueAnimator)的時候返回值,這個方法在每一幀的值被計算出來時立即被調用。
返回值:只有一個屬性在進行動畫時,返回最近計算出的值。如果若干個屬性在進行動畫(通過若干個PropertyValuesHolder結構指定的屬性),這個方法會返回這些對象中的每一個的值。
Object getAnimatedValue(String propertyName)
ValueAnimator計算的該屬性的最近的值。這個只讀屬性的主要目的是在調用onAnimationUpdate(ValueAnimator)的時候返回值,這個方法在每一幀的值被計算出來時立即被調用。
long getCurrentPlayTime()
獲取當前動畫位置所處時間,它等於當前時間減去開始時間。一個還沒開始的動畫會返回0,除非這個動畫通過setCurrentPlayTime(long)或者setCurrentFraction(float)設置了時間,這時會返回所設置的值。
long getDuration()
獲取動畫的長度,以毫秒記。默認是300毫秒。
staticlong getFrameDelay()
幀與幀之前的時間間隔,以毫秒計。這是一個必要的動畫嘗試屢行的時間,但真實的間隔時間可能不同,這取決於系統系統負載和性能。這裡一個靜態的方法,因為相同的延時將被被應用到所有動畫上,而這些動畫運行在一個單一的時間循環內。(譯注:翻譯的不對,反正是public static)設個幀延時會在使用外部的定時資源來管理動畫時被忽略,比如使用display refresh rate (vsync)。注意這個方法應該在調用start()方法的相同線程中被調用。如果線程沒有Looper會返回運行錯誤。
TimeInterpolator getInterpolator()
返回ValueAnimator使用的時間插值器。
int getRepeatCount()
定義動畫應該重復多少次,默認值是0。
返回值:重復次數或INFINITE
int getRepeatMode()
定義動畫到達結尾時的操作。
返回值:REVERSE或者RESTART
long getStartDelay()
在調用start()後,延時多少時間開始啟動畫,以毫秒計。
long getTotalDuration()
獲取總的動畫時間,包括動畫系列、列始延時和重復。如果時間是無限的,返回DURATION_INFINITE
PropertyValuesHolder[] getValues()
返回動畫運動的值范圍。這些值儲存在PropertyValuesHolder對象中,即使ValueAnimator是通過值數組創建的。
返回:一個PropertyValuesHolder對象的數組,它持有動畫定義的數值、每一個屬性。
boolean isRunning()
返回是否在運行(已起啟動並且過了開始動畫間隔時間,並且還沒結束。)
boolean isStarted()
返回動畫是否已經開始且還沒結束。對於可多次使用的動畫器(大多數動畫器都是,與createCircularReveal()產生的一次性動畫器區別開),isStarted()是isRunning()的父集,因為一個startDelay不為0的動畫器,在這個延時階段,isStarted()返回true,但呆有在延時階段完成後,isRunning()才返回true。不可重復的動畫器在開始後總是返回true,因為它們無法到到一個未開始的狀態。
static ValueAnimator ofArgb(int… values)
構造並返回一個在顏色值間動畫的ValueAnimator。單個值表示該值是動畫的目標值,但一般是沒用的,因為動畫器沒有辦法確定動畫的開始值(不同於ObjectAnimator,它可以通過動畫的目標對象和屬性來派生出開始值)。因此,一般應該用2個或更多的值。
static ValueAnimator ofFloat(float… values)
構造並返回一個在浮點數值間動畫的ValueAnimator。單個值同上。
static ValueAnimator ofInt(int… values)
構造並返回一個在整型數值間動畫的ValueAnimator。單個值同上。
static ValueAnimator ofObject(TypeEvaluator evaluator, Object… values)
構造並返回一個在Object間動畫的ValueAnimator。單個值同上。
注意:對象的值保存的是原始對象的引用,也就意味著這個方法調用後,動畫器將影響原始值。如果對象在這個方法被調用後要外部改變值,那麼調用者應該傳一個對象的拷內。
因為ValueAnimator不知道在任意的對象中怎麼動畫,所以這個方法還需要一個TypeEvaluator對象來讓動畫器執行插值。
參數:TypeEvaluator evaluator,被每一幀動畫調用以提供必要的對象與起始對象間的插值。
static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder… values)
構造並返回一個動畫的ValueAnimator,它的值在指明的Property ValuesHolder間。
void pause()
暫停一個正在運行的動畫。這個方法只應該在啟動動畫的同一線程中調用。如果一個動畫還沒有開始,或者已經結束,這個調用會被忽略。暫停動畫後可以通過調用resume()來繼續動畫。
void removeAllUpdateListeners()
移除所有監聽動畫更新的監聽器。
void removeUpdateListener(ValueAnimator.AnimatorUpdateListener listener)
從監聽器組中移除一個。
void resume()
繼續一個暫停的動畫,它會讓動畫從暫停時的點繼續。這個方法只應該在啟動動畫的同一線程中調用。如果動畫還沒有暫停,調用這個方法會被忽略。
void reverse()
反向播放動畫。如果一個動畫仍在運行,它將停止動畫並從調用reverse()時動畫已運行到點反向播放。如果動畫沒有在運行,它將從結束點反向播放。這個行為只適用於當前動畫,未來播放的動畫會使用默認的行為。
void setCurrentFraction(float fraction)
設置當前動畫的位置為指定的分數。這個分數應該在0到動畫的總分數之間,包括任意的重復。也就是說,分數0將把動畫定位到開頭,1定位到結尾,如果是重復一次的動畫,2將定位反向動畫器的結尾(譯注:這裡翻譯寶寶不明白,反向的2不是回到開頭嗎。)。如果一個動畫還沒有開始,設置這個分數後並不會向前移動到;它只會簡單地設置值為這個分數,同時執行一些和這個值相關的操作。如果動畫已經在運行,這個方法會設置當前分數值並且從那個點繼續播放。改變分數值並不會調用Animator.AnimatorListener 的事件,這些事件只會在動畫運行時處理。
參數:float fraction,設置動畫前進至或後退至的值。不在0到最大分數間的值,將會被修正到正確的范圍。
void setCurrentPlayTime(long playTime)
設置當前動畫的位置為指定的時間點。這個時間應該在0到動畫的總時間之間,包括任意的重復。如果一個動畫還沒有開始,設置這個時間後並不會向前移動到;它只會簡單地設置值為這個時間,同時執行一些和這個值相關的操作。如果動畫已經在運行,這個方法會設置當前播放時間並且從那個點繼續播放。
參數:long playTime,以毫秒記。
ValueAnimator setDuration(long duration)
設置動畫的長度。默認是300毫秒。這個值不能為負數。
void setEvaluator(TypeEvaluator value)
當計算動畫的值時所使用的evaluator。系統會根據構造函數中的起始值來自動分配一個浮點或整型的evaluator。如果構造函數的起始值不是基本類型,或者期望一個不同的evaluator(比如表示顏色的整理就需要),就可指定一個自定義的evaluator。比如,當用顏色值來進行動畫時,就應該用一個ArgbEvaluator來獲取正確的RGB插值。
如果ValueAnimator的動畫范圍值只有一組,這個evaluator會給那一組數值使用。如果有通過PropertyValuesHolder設置的多組數值在動畫,這個evaluator只會指派給第一個PropertyValuesHolder使用。
void setFloatValues(float… values)
設置浮點數值的動畫區間。單個值表示該值是動畫的目標值,但一般是沒用的,因為動畫器沒有辦法確定動畫的開始值(不同於ObjectAnimator,它可以通過動畫的目標對象和屬性來派生出開始值)。因此,一般應該用2個或更多的值。
如果動畫器中有通過PropertyValuesHolder設置的多組數值,這個方法只會設置第一個的數值。
staticvoid setFrameDelay(long frameDelay)
每一幀動畫間的間隔,以毫秒記。這是一個必要的動畫嘗試屢行的時間,但真實的間隔時間可能不同,這取決於系統系統負載和性能。這裡一個靜態的方法,因為相同的延時將被被應用到所有動畫上,而這些動畫運行在一個單一的時間循環內。(譯注:翻譯的不對,反正是public static)設個幀延時會在使用外部的定時資源來管理動畫時被忽略,比如使用display refresh rate (vsync)。注意這個方法應該在調用start()方法的相同線程中被調用。如果線程沒有Looper會返回運行錯誤。
void setIntValues(int… values)
設置整型數值的動畫區間。單個值和多組值同setFloatValues()
void setInterpolator(TimeInterpolator value)
計算動畫經過的時間的時間插值器。這個插值器確定動畫是線性還是非線性的動動。比如加速、減速,默認是AccelerateDecelerateInterpolator
void setObjectValues(Object… values)
設置動畫的值區間。同ofObject
void setRepeatCount(int value)
設置動畫重復次數。如果得復次數是0,動畫將不重復。如果重復次數大於0或者是INFINITE,重復模式將被考慮在內。重復次數默認是0.
void setRepeatMode(int value)
定義動畫在到達結尾時怎麼操作。這個設置只有在重復次數大於0或者是INFINITE時才有用,默認是RESTART。
參數:int value,RESTART或者REVERSE
void setStartDelay(long startDelay)
在調用start()後延時多少時間開始動畫,以毫秒記。注意這個開始延時應該總是非負的,一個負的開始延時將會被修改。(譯注:原文是Any negative start delay will be clamped to 0 on N and above,不明白什麼意思,在源碼中也沒有找到相關代碼。)
void setValues(PropertyValuesHolder… values)
設置動畫的每一個屬性值。這個方法是使用一組值作為構造函數時被內部調用。但如果構造函數沒有值,通過這個方法來設置值,是不能創建ValueAnimator的。
void start()
開始動畫。如果動畫有非0的開始延時,在延時結束後動畫會開始運行。非延時的動畫將馬上設置初始值,然後調用監聽器的onAnimationStart(Animator)
通過這個方法開始運行的動畫將在調用方法所在線程運行。這個線程要有一個Looper(否則會拋出運行異常)。同樣的,如果一個動畫改變視圖層的對象屬性,那麼調用線程就應該是那個視圖層的UI線程。
String toString()
返回描述對象的字符串。通常toString方法返回一個“用文字描述”這個對象的字符串。返回結果應該簡潔但信息豐富以便人閱讀。推薦所有的子類都重寫這個方法。
Object類的toString方法返回由Object的一個實例的類名,@符號,和該對象hashcode(一個無符號的十六進制表達式)組成的字符串。換句話說,這個方法的返回值等於
getClass().getName() + '@' + Integer.toHexString(hashCode())

譯注4:clone()
創建並返回當前對象的copy(譯注:拷貝),“copy”精確的含義決定於object類,通常的意思是,對於任意一個對象x,下列表達式的值為true

 x.clone() != x

並且下面表達式的為true

x.clone().getClass() == x.getClass()

有一些不是絕對的要求,比如下面的表達式為true,但不是強制要求。

 x.clone().equals(x)

按照約定,返回的對象應該通過super.clone()獲得,如果一個類和它所有的父類(除了Object)都遵守這個約定,那麼表達式成立x.clone().getClass() == x.getClass().
按照約定,這個方法返回的對象應該獨立於當前對象(被克隆的)。為了實現這種獨立性,通過super.clone()得到的對象必須修改一個或多個字段,再返回。一般地,復制一個包含內部“深層結構”的對象時,內部對象也要被復制並且被復制的對象引用。(譯注:不會翻譯,大概就是說如果clone的對象中有別的類型的字段,那個字段也要被克隆)如果一個類只包含基本類型的字段或不可變的字段,那麼super.clone()返回的對象不需要修改任何字段。
Object類的clone方法執行特殊的克隆操作。首先如果一個類沒有實現Cloneable接口,會拋出一個CloneNotSupportedException異常。注意,所的的數組都被視為實現了Cloneable接口,數組T[]的clone方法返回一個T[],T是任意的引用類型或基本類型。不同的,這個方法創建一個該對象的類的新實例,並且初始化所有的字段,初始字段的值和該對象的相應字段的值保持一致,as if by assignment(譯注:不曉得啥意思);字段的內容不是他們自己克隆的。因些,這個對象的clone只是一個“淺克隆”操作,不是“深克隆”操作。
Object類沒有實現Cloneable接口,所以克隆一個Object類將拋出錯誤。(譯注:Object的clone方法是protected的)

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved