Android 屬性動畫(一)

筆記 :

Android 中的三類動畫:Frame Animation(逐幀動畫),Tween Animation(補間動畫),Property Animatior(屬性動畫)。
Frame Animation :逐幀動畫就是通過播放預先排序好的圖片來實現動態的畫面。
Tween Animation :補間動畫是對某個View進行一系列的動畫操作,包括淡入淡出(Alpha),縮放(Scale),平移(Translate),旋轉(Rotate) 四種模式。
Property Animatior:屬性動畫是Android3.0之后引進的,它更改的是動畫的實際屬性,在Tween Animation(補間動畫)中,其改變的是View的繪制效果,真正的View的屬性是改變不了的,比如你將你的Button位置移動之后你再次點擊Button是沒有任何點擊效果的,或者是你如何縮放你的Button大小,縮放后的有效的點擊區域還是只有你當初初始的Button的大小的點擊區域,其位置和大小的屬性并沒有改變。而在Property Animator(屬性動畫)中,改變的是動畫的實際屬性,如Button的縮放,Button的位置和大小屬性值都會發生改變。而且Property Animation不止可以應用于View,還可以應用于任何對象,Property Animation只是表示一個值在一段時間內的改變,當值改變時要做什么事情完全是你自己決定的。

最近,工作項目中加入了直播模塊業務(忍不住想吐槽了,現在項目加入直播之后,變得龐大笨重,,,呵呵噠了,以后出去跟別人吹牛,我可以一本正經地說:電商、社區和直播 我都做過!!!),大家都知道,直播中就需要大量地動畫實現,比如:打賞動畫啦,特效啦,等等。所以,我想對Android 的 屬性動畫(其他倆動畫,大家可以自己網上搜搜)做個總結,也算是對自己知識的積累和鞏固。

Property Animatior (屬性動畫官網網址

相關API概覽:

1.Animators: subclasses extend Animator

Class Description
ValueAnimator 屬性動畫的主要時序引擎,并計算將要進行動畫的屬性的值。它擁有所有的核心功能,計算動畫值,并包含每個動畫的時間細節,動畫是否重復的信息,接收更新事件的偵聽器,以及可以計算設置的自定義類型。動畫屬性有兩部分:計算動畫值并將值設定到正在動畫的對象的屬性上。ValueAnimator不進行管理第二部分,所以你必須監聽ValueAnimator計算出的值,并按自己的邏輯更新和修改的動畫對象(把動畫值設置到動畫對象屬性上)。
ObjectAnimator ValueAnimator的基類,允許你設定一個目標對象和對象屬性的動畫。當它為動畫計算一個新值時,該類相應地更新屬性。大部分時間你想用objectanimator,因為它使設置動畫值到目標對象的過程更容易。然而,有時你想直接使用ValueAnimator,因為ObjectAnimator有較多一點的限制,如要求目標對象中存在特定的acessor方法。
AnimatorSet 動畫集合,提供一種機制,使組動畫一起運行,以便它們相互運行。您可以設置動畫一起播放,順序播放,或在指定的延遲后播放。

2.Evaluators 求值器:屬性動畫系統如何計算屬性值

Class Description
IntEvaluator 整數型求值器
FloatEvaluator 浮點型求值器
ArgbEvaluator 顏色求值器
TypeEvaluator 一個接口,允許你創建自己的計算器。如果你執行動畫的對象屬性不是int,float,或顏色,你必須實現的TypeEvaluator接口指定如何計算對象屬性值的動畫。你也可以自定義一個 TypeEvaluator 為 int,浮動,和顏色的類型,來實現這些類型不同的默認行為。

3.Interpolators 插值器,按某種方式計算某一時間下的動畫值。

Class Description
AccelerateDecelerateInterpolator 變化率開始和結束緩慢而加速通過中間
AccelerateInterpolator 變化率開始緩慢,然后加快
AnticipateInterpolator 開始時先后退點,然后向前
AnticipateOvershootInterpolator 其變化開始時落后,甩向前和過沖的目標值,然后最終返回到最終值。
BounceInterpolator 其改變跳動在末端。
CycleInterpolator 動畫將重復周期的指定數目。
DecelerateInterpolator 變化率開始時快,然后再減慢。
LinearInterpolator 速度是恒定
OvershootInterpolator 甩向前和過沖的目標值,然后最終返回到最終值。
TimeInterpolator 接口,允許定義自己的插值器

Animating with ValueAnimator

  // ofInt() , onFloat() , ofObject()
  //  start() 后,就會計算 1000毫秒內,從 0 到  1時 ,各時間的動畫值
  ValueAnimator animation = ValueAnimator.ofFloat(0f,1f);
  animation.setDuration(1000);
  animation.start();

  //自定義一個 求值器。
  ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
  animation.setDuration(2000);
  animation.start();

當然,以上直接運行時不會產生動畫效果的,因為ValueAnimator 需要手動指定目標動畫對象屬性的。我們添加如下代碼:

  //監聽 animation 的動畫值的變化,并改變 View 的屬性值
  animation.addUpdateListener(new AnimatorUpdateListener()  
  {  
       @Override  
      public void onAnimationUpdate(ValueAnimator animation)  
      {  
           // 改變 mView(比如:ImageView,TextView等) 的透明度
           mView.setAlpha((Float) animation.getAnimatedValue());  
      }  
  });  

Animating with ObjectAnimator

  ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(animView,"alpha",1f,0f,1f);
  objectAnimator.setDuration(2000);
  objectAnimator.start();

實現如同 ValueAnimator 的效果,發下代碼少了不少。不過,ValueAnimator靈活性高些。
提示
1.ObjectAnimator 設置對應的動畫屬性時,如果該屬性在target(動畫目標對象)中不存在,我們則需要自己定義該屬性相對應的setter方法,然后去執行 invalidate()屬性動畫目標對象呈現動畫。
2.當只設置一個屬性值(如下)時,默認是結束的動畫值。且當是自定義的屬性時,我們要提供一個屬性值的同類型的setter和getter方法,如下則 都是 float 型

ObjectAnimator.ofFloat(animView,"alpha",1f);

Choreographing Multiple Animations with AnimatorSet

動畫集合通過對多個動畫的執行順序進行排列實現更加酷炫的動畫效果。如下實現圖片的同時縮放和淡出淡入,并隨后360度翻轉。

//實現 同時透明和縮放 ,隨后360翻轉
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator objectAnimator1 =ObjectAnimator.ofFloat(animView,"alpha",1f,0f,1f);
objectAnimator1.setDuration(2000);
ObjectAnimator objectAnimator2 =ObjectAnimator.ofFloat(animView,"scaleX",1f,0f,1f);
objectAnimator2.setDuration(2000);
ObjectAnimator objectAnimator3 =ObjectAnimator.ofFloat(animView,"scaleY",1f,0f,1f);
objectAnimator3.setDuration(2000);
ObjectAnimator objectAnimator4 = ObjectAnimator.ofFloat(animView,"rotationX",0f,360f);
objectAnimator4.setDuration(2000);
animatorSet.playTogether(objectAnimator1,objectAnimator2,objectAnimator3);
animatorSet.play(objectAnimator4).after(objectAnimator1);
animatorSet.start();

AnimatorSet 提供了 play()執行方法 和 before(),after(),with()的組合方式。

Animation Listeners

動畫的監聽: 開始,結束,重復,取消

Animator.AnimatorListener

ValueAnimator.AnimatorUpdateListener

如果,你只需要監聽 end 方法的話,可以這樣調用 AnimatorListenerAdapter

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorListenerAdapter() {
    public void onAnimationEnd(Animator animation) {    
      balls.remove(((ObjectAnimator)animation).getTarget());
    }
}

動畫效果我下回上傳。

由于Property Animator 知識點太多,這篇文章就先寫到這里,算是對屬性動畫的一個初步認識和使用的介紹。隨后,我會添加上 Evaluator,Interpolator , xml文件創建屬性動畫 和 布局動畫的介紹。fighting!!!

源碼,源碼中還有我之前寫的防直播打賞禮物動畫效果。歡迎大家指教!

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

推薦閱讀更多精彩內容