Android属性动画 ObjectAnimator
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/118709616
 本文出自【趙彥軍的博客】
文章目錄
- ObjectAnimator
- 實戰-心跳動畫
- 參考資料
ObjectAnimator
public final class ObjectAnimator extends ValueAnimator { ... }ObjectAnimator 繼承 ValueAnimator , 所以 ObjectAnimator 擁有 ValueAnimator 一切特性。
相比于ValueAnimator,ObjectAnimator可能才是我們最常接觸到的類,因為ValueAnimator只不過是對值進行了一個平滑的動畫過渡,但我們實際使用到這種功能的場景好像并不多。而ObjectAnimator則就不同了,它是可以直接對任意對象的任意屬性進行動畫操作的,比如說View的alpha屬性。
不過雖說ObjectAnimator會更加常用一些,但是它其實是繼承自ValueAnimator的,底層的動畫實現機制也是基于ValueAnimator來完成的,因此ValueAnimator仍然是整個屬性動畫當中最核心的一個類。那么既然是繼承關系,說明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它們的用法也非常類似,這里如果我們想要將一個TextView在5秒中內從常規變換成全透明,再從全透明變換成常規,就可以這樣寫:
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); animator.setDuration(5000); animator.start();可以看到,我們還是調用了ofFloat()方法來去創建一個ObjectAnimator的實例,只不過ofFloat()方法當中接收的參數有點變化了。這里第一個參數要求傳入一個object對象,我們想要對哪個對象進行動畫操作就傳入什么,這里我傳入了一個textview。第二個參數是想要對該對象的哪個屬性進行動畫操作,由于我們想要改變TextView的不透明度,因此這里傳入"alpha"。后面的參數就是不固定長度了,想要完成什么樣的動畫就傳入什么值,這里傳入的值就表示將TextView從常規變換成全透明,再從全透明變換成常規。之后調用setDuration()方法來設置動畫的時長,然后調用start()方法啟動動畫,效果如下圖所示:
學會了這一個用法之后,其它的用法我們就可以舉一反三了,那比如說我們想要將TextView進行一次360度的旋轉,就可以這樣寫:
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f); animator.setDuration(5000); animator.start();可以看到,這里我們將第二個參數改成了"rotation",然后將動畫的初始值和結束值分別設置成0和360,現在運行一下代碼,效果如下圖所示:
那么如果想要將TextView先向左移出屏幕,然后再移動回來,就可以這樣寫:
float curTranslationX = textview.getTranslationX(); ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX); animator.setDuration(5000); animator.start();這里我們先是調用了TextView的getTranslationX()方法來獲取到當前TextView的translationX的位置,然后ofFloat()方法的第二個參數傳入"translationX",緊接著后面三個參數用于告訴系統TextView應該怎么移動,現在運行一下代碼,效果如下圖所示:
 然后我們還可以TextView進行縮放操作,比如說將TextView在垂直方向上放大3倍再還原,就可以這樣寫:
這里將ofFloat()方法的第二個參數改成了"scaleY",表示在垂直方向上進行縮放,現在重新運行一下程序,效果如下圖所示:
 到目前為止,ObjectAnimator的用法還算是相當簡單吧,但是我相信肯定會有不少朋友現在心里都有同樣一個疑問,就是ofFloat()方法的第二個參數到底可以傳哪些值呢?
目前我們使用過了alpha、rotation、translationX和scaleY這幾個值,分別可以完成淡入淡出、旋轉、水平移動、垂直縮放這幾種動畫,那么還有哪些值是可以使用的呢?
其實這個問題的答案非常玄乎,就是我們可以傳入任意的值到ofFloat()方法的第二個參數當中。任意的值?相信這很出乎大家的意料吧,但事實就是如此。因為ObjectAnimator在設計的時候就沒有針對于View來進行設計,而是針對于任意對象的,它所負責的工作就是不斷地向某個對象中的某個屬性進行賦值,然后對象根據屬性值的改變再來決定如何展現出來。
那么比如說我們調用下面這樣一段代碼:
ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f);其實這段代碼的意思就是ObjectAnimator會幫我們不斷地改變textview對象中alpha屬性的值,從1f變化到0f。然后textview對象需要根據alpha屬性值的改變來不斷刷新界面的顯示,從而讓用戶可以看出淡入淡出的動畫效果。
那么textview對象中是不是有alpha屬性這個值呢?
沒有,不僅textview沒有這個屬性,連它所有的父類也是沒有這個屬性的!
這就奇怪了,textview當中并沒有alpha這個屬性,ObjectAnimator是如何進行操作的呢?其實ObjectAnimator內部的工作機制并不是直接對我們傳入的屬性名進行操作的,而是會去尋找這個屬性名對應的get和set方法,因此alpha屬性所對應的get和set方法應該就是:
public void setAlpha(float value); public float getAlpha();那么textview對象中是否有這兩個方法呢?確實有,并且這兩個方法是由View對象提供的,也就是說不僅TextView可以使用這個屬性來進行淡入淡出動畫操作,任何繼承自View的對象都可以的。
既然alpha是這個樣子,相信大家一定已經明白了,前面我們所用的所有屬性都是這個工作原理,那么View當中一定也存在著setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()這些方法,不信的話你可以到View當中去找一下。
實戰-心跳動畫
先上效果圖:
 自定義 View
有一點很重要的是,radius 的 set 方法中需要調用 invalidate() 方法,才能夠刷新view
我們再看執行動畫的部分
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)var myView: MyView = findViewById(R.id.myView)//通過動畫,不斷的改變 radius 的值var objectAnimator =ObjectAnimator.ofFloat(myView, "radius", 200f, 500f, 200f)objectAnimator.duration = 600objectAnimator.interpolator = LinearInterpolator()objectAnimator.repeatCount = 20 //執行20次objectAnimator.start()} }參考資料
- Android屬性動畫完全解析(上),初識屬性動畫的基本用法
總結
以上是生活随笔為你收集整理的Android属性动画 ObjectAnimator的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Android属性动画 ValueAni
- 下一篇: Android属性动画 Animator
