1. 程式人生 > >Android 屬性動畫和補間動畫的區別和特性

Android 屬性動畫和補間動畫的區別和特性

補間動畫

  • 補間動畫,主要是向View物件設定動畫效果,包括AlphaAnimation 、RotateAnimation 、ScaleAnimation 、TranslateAnimation 這4種效果,對應的xml標籤分別是alpha、rotate、scale、translate。通過為動畫設定初始和終止對應的值,根據插值器和duration計算動畫過程中間相應的值實現平滑運動,即設定初始和終止狀態,插值器來計算填補初始狀態到終止狀態間的動畫

  • 使用 
    1、設定相應動畫效果的起點值、終點值、duration(時長)、Interpolator(加速度)。(注:RotateAnimation還需要設定旋轉中心座標值) 
    2.Interpolator:插值器,隨時間流逝動畫路程所應走過的百分比。

    比如,若設定為LinearInterpolator(勻速),時間過一半則插值器的值是0.5;若設定的是DecelerateInterpolator(加速插值器),時間過一半則插值器的值大於0.5

  •  val transAnimation = TranslateAnimation(text.x, 100F,text.y,395f)
    
     transAnimation.duration=2000
    
     transAnimation.interpolator = BounceInterpolator()
    
     text.startAnimation(transAnimation)

屬性動畫

  • 屬性動畫可以對任何物件的屬性做動畫而不僅僅是View,甚至可以沒有物件。除了作用物件進行擴充套件外,屬性動畫的效果也加強了,不僅能實現View動畫的4中效果,還能實現其它多種效果,這些效果都是通過ValuAnimator或ObjectAnimator、AnimatorSet等來實現的。

  • 使用 
    1、設定作用物件、屬性的起點值、屬性的終點值、TypeEvaluator(路線)、duration(時長)、Interpolator(加速度)。 

ValueAnimator基本使用

  val valueAnimator = ValueAnimator.ofInt(0,100)

      valueAnimator.duration =2000

      valueAnimator.interpolator = AccelerateDecelerateInterpolator()

      valueAnimator.addUpdateListener({

           var intValue = it.animatedValue

            //do something with intValue
        })

View屬性動畫原理:屬性動畫要求作用的物件(如View)提供該屬性(如View的scaleX屬性)的getter、setter方法(如setScaleX()方法)。屬性動畫根據作用物件的屬性的起點值、終點值、TypeEvaluator在動畫過程中據插值器(Interpolator)計算當前時間對應的值然後作用到相應的屬性上從而使作用物件發生相應的改變。

  • ObjectAnimator基本使用(text為一個textView,下圖為一個快速使用方法)
  • text.animate()
                    .translationX(100f)
                    .translationY(100f)
                    .setDuration(2000)
                    .setInterpolator(AccelerateDecelerateInterpolator())
                    .withEndAction({
                        //do something 
                    })

 區別和特性

1.  補間動畫:只產生了一個動畫效果,其真實的座標並沒有發生改變(只是改變了View的顯示效果而已,並不會真正的改變View的屬性)。View做在做動畫的時候,它並沒有真正的移動它的位置,而是根據動畫時間的插值,計算出一個Matrix,然後不停的invalidate,在onDraw中的Canvas上使用這個計算出來的Matrix去draw這個View的內容,並有onLayout中還是原來的位置,所以點選事件只能點選到原來的位置才能觸發

2. ObjectAnimator:一般直接用與View,要求作用的View提供該屬性(如View的scaleX屬性)的getter、setter方法(如setScaleX()方法),可以直接改變view的屬性所以View的位置也跟隨屬性的改變而改變,點選事件的觸發位置為動畫結束的位置。

3. ValueAnimator:屬性動畫的核心,這個我理解為數值動畫,ObjectAnimator也只不過是通過不斷改變的數值然後賦值給相應的屬性而已。通過設定初始和終點值,ValueAnimator 會通過相應的Interpolator  duration 計算出平滑的數值變化,然後可以通過得到的Value進行任意操作