認識動畫(4)-PropertyValueHolder&Keyframe

前言

前面給大家介紹了ValueAnimator,ObjectAnimator的知識,講解了他們ofInt,ofFloat,ofObject函數的用法.其實除了這些方法還有一個方法來幫助我們創建動畫:

/** 
 * valueAnimator的 
 */  
public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values)   
/** 
 * ObjectAnimator的 
 */  
public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values) 

接下來讓我們進一步了解這種創建動畫的方式.

PropertyValueHolder

概述

PropertyValuesHolder這個類的意義就是,他其中保存了動畫過程中所需要操作的屬性和對應的值.我們通過ofFloat(Object target ,String propertyName, float.. values)構造的動畫,ofFloat()的內部實現其實就是將傳進來的參數封裝成PropertyValueHolder實例來保存動畫狀態,在封裝成PropertyValueHolder實例以后,后期的各種操作也是以PropertyValuesHolder為主的.
上面也說了,ObjectAnimatora給我們提供了一個方法讓我們自己構造PropertyValuesHolder來構造動畫.

public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)  

接下來我們看看如何構造PropertyValuesHolder.主要方法如下:

public static PropertyValuesHolder ofFloat(String propertyName, float... values)  
public static PropertyValuesHolder ofInt(String propertyName, int... values)   
public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)  
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)  

PropertyValuesHolder之ofFloat(),ofInt()

我們先來看看它的構造函數

public static PropertyValuesHolder ofFloat(String propertyName, float... values)  
public static PropertyValuesHolder ofInt(String propertyName, int... values) 

再看看ObjectAniamator的構造函數

public static ObjectAnimator ofFloat(Object target, String propertyName, float... values); 

是不是覺得很熟悉,沒錯,構造方式除了比PropertyValuesHolder多了一個target參數之外和ObjectAniamator的構造方式一毛一樣.

ObjectAnimator.ofPropertyValuesHolder()

了解了怎么創建PropertyValuesHolder實例,接下來我們看看怎么得到ObjectAnimator實例.

public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values) 

其中:

  • target:我們要執行動畫的控件
  • values:是一個可變長參數,可以傳進去多個PropertyValuesHolder實例,由于每個PropertyValuesHolder實例都會針對一個屬性做動畫,多以如果傳進去多個PropertyValuesHolder實例,將會對控件的多個屬性同時進行操作.

PropertyValuesHolser之ofObject

同樣的我們先來看一下ofObject的構造函數

public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values) 
  • propertyName:ObjectAniamtor動畫操作的屬性名;
  • evaluator:Evaluator實例,Evaluator是將當前動畫進度計算出當前值的類,可以使用系統自帶的IntEvaluator,FloatEvenluator也可以自定義.
  • values:可變長參數,表示操作動畫屬性的值

PropertyValuesHolser之其它函數

/** 
 * 設置動畫的Evaluator 
 */  
public void setEvaluator(TypeEvaluator evaluator)  
/** 
 * 用于設置ofFloat所對應的動畫值列表 
 */  
public void setFloatValues(float... values)  
/** 
 * 用于設置ofInt所對應的動畫值列表 
 */  
public void setIntValues(int... values)  
/** 
 * 用于設置ofKeyframe所對應的動畫值列表 
 */  
public void setKeyframes(Keyframe... values)  
/** 
 * 用于設置ofObject所對應的動畫值列表 
 */  
public void setObjectValues(Object... values)  
/** 
 * 設置動畫屬性名 
 */  
public void setPropertyName(String propertyName)  

Keyframe

概述

Keyframe直譯過來就是關鍵幀,關鍵幀這個概念是從動畫里學來的,我們知道視頻里一秒要播放24幀圖片,對于制作flash動畫的同學來講,是不是每一幀都要畫出來?當然不是了,如果每一幀都要畫出來,那估計一個動畫都得一年;比如我們要做一個讓一個球在30秒內,從(0,0)運動到(300,200)點,那flash是怎么做的,在flash中我們只需要定義兩個關鍵幀,把球放在起點,30秒后把球的位置放在(300,200)點.在動畫開始時,球初始在(0,0)點,30秒的時間adobe flash就會自動填充,把球平滑移動到第二個關鍵幀的位置上.
通過分析上面的動畫制作原理,我們知道一個關鍵幀必須包含兩個元素,第一時間點,第二位置.所以Keyframe也不例外,Keyframe的生成方式為:

Keyframe kf0 = Keyframe.ofFloat(0, 0);  
Keyframe kf1 = Keyframe.ofFloat(0.1f, -20f);  
Keyframe kf2 = Keyframe.ofFloat(1f, 0); 

上面生成了3個對象,其中Keyframe的onFloat聲明方式為

public static Keyframe ofFloat(float fraction, float value)  
  • fraction:表示當前的顯示進度,
  • value:表示當前屬性值
    當生成Keyframe對象后通過下面方法來生成PropertyValuesHolder對象
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)  
  • propertyName:動畫所要操作的屬性名
  • value:Keyframe的列表,PropertyValuesHolder會根據每個Keyframe的設定,定時將制定的值輸出給動畫.
    接下來讓我們看看完整的使用代碼:
Keyframe frame0 = Keyframe.ofFloat(0f, 0);  
Keyframe frame1 = Keyframe.ofFloat(0.1f, -20f);  
Keyframe frame2 = Keyframe.ofFloat(1, 0);  
PropertyValuesHolder frameHolder = PropertyValuesHolder.ofKeyframe("rotation",frame0,frame1,frame2);  
 Animator animator = ObjectAnimator.ofPropertyValuesHolder(mImage,frameHolder);  
animator.setDuration(1000);  
animator.start();  

第一步:生成Keyframe對象;
第二步:利用PropertyValuesHolder.ofKeyframe生成PropertyValuesHolder對象
第三步:ObjectAnimator.ofPropertyValuesHolder()生成對應的Animator

常用函數

生成Keyframe實例的一些常用函數

public static Keyframe ofFloat(float fraction)   
public static Keyframe ofFloat(float fraction, float value)  
/** 
 * ofInt 
 */  
public static Keyframe ofInt(float fraction)  
public static Keyframe ofInt(float fraction, int value)  

Keyframe的一些常用函數

/** 
 * 設置fraction參數,即Keyframe所對應的進度 
 */  
public void setFraction(float fraction)   
/** 
 * 設置當前Keyframe所對應的值 
 */  
public void setValue(Object value)  
/** 
 * 設置Keyframe動作期間所對應的插值器 
 */  
public void setInterpolator(TimeInterpolator interpolator)  

這是3個函數中,插值器的作用應該比較難理解,如果給這個Keyframe設置上插值器,那么這個插值器就是從上一個Keyframe開始到設置插值器的Keyframe時,這個過程值的計算是利用這個插值器的.所以給第一幀設置插值器是無效的.

Keyframe之ofObject

與ofInt,ofFloat一樣,ofObject也有兩個構造函數:

public static Keyframe ofObject(float fraction)  
public static Keyframe ofObject(float fraction, Object value)  

同樣,如果使用ofObject(float fraction)來構造,也必須使用setValue(Object value)來設置這個關鍵幀所對應的值。

Keyframe總結

  • 如果去掉地第0幀,將以第一個關鍵幀為起始幀
  • 如果去掉結束幀,將以最后一幀作為結束幀
  • 使用Keyframe來構建動畫,至少要有兩個或兩個以上的幀

文章來自
http://blog.csdn.net/harvic880925/article/details/50752838

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容