Android之属性动画初步
生活随笔
收集整理的這篇文章主要介紹了
Android之属性动画初步
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android動(dòng)畫系統(tǒng)包括View animation和Property animation,也就是視圖動(dòng)畫和屬性動(dòng)畫,屬性動(dòng)畫有API限制,必須在API 11以上使用,不過有個(gè)開源項(xiàng)目NineOldAndroids,實(shí)現(xiàn)了對(duì)API 11之前版本的支持。
視圖動(dòng)畫相對(duì)于屬性動(dòng)畫來說簡(jiǎn)單一些,只能對(duì)view做移動(dòng)、旋轉(zhuǎn)、縮放等處理。舉例來說做View移動(dòng)的效果,視圖發(fā)生時(shí)改變View在屏幕上的繪制位置,但與這個(gè)View相關(guān)的屬性值卻不會(huì)改變,所以會(huì)發(fā)現(xiàn)響應(yīng)點(diǎn)擊事件還在原來的位置上,也就是看上去變了,實(shí)際上根還在原來的地方;而屬性動(dòng)畫改變的是實(shí)際的屬性值,也就是View位置發(fā)生變化了,他的相關(guān)屬性值也確實(shí)發(fā)生了改變。而且屬性動(dòng)畫可以改變已有的屬性類型,還可以改變自定義的類型,也就是說屬性動(dòng)畫是一種廣義的動(dòng)畫系統(tǒng),用于表現(xiàn)一種連續(xù)變化的過程,而不僅僅是視圖上的物理變化。
中間值的計(jì)算涉及到兩個(gè)方面,一個(gè)是插值器函數(shù),也就是對(duì)應(yīng)的Interpolator,表示程度隨時(shí)間的變化情況,比如勻速、加速,或者先加速后減速等;另一個(gè)是中間值的計(jì)算函數(shù),對(duì)應(yīng)到TypeEvaluator,這是一個(gè)接口,里面有evaluate(float fraction, T startValue, T endValue)方法需要實(shí)現(xiàn),對(duì)一般的值計(jì)算方法都是startValue + fraction * (endValue - startValue),也有特殊的比如顏色值,用一個(gè)int表示了argb,計(jì)算的時(shí)候就要先分解計(jì)算再合成,但對(duì)于每個(gè)分量的計(jì)算任然遵守上面的規(guī)則,具體可以看ArgbEvaluator的源文件。
ValueAnimator除了上面的默認(rèn)值類型,還支持自定義類型Object,對(duì)于自定義類型,使用者需要實(shí)現(xiàn)該類型對(duì)應(yīng)的TypeEvaluator,如下
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue); animation.setDuration(1000); animation.start(); 屬性動(dòng)畫要對(duì)View起作用需要將每次改變的屬性值設(shè)置到相應(yīng)的View上,上面提到ValuAnimator只負(fù)責(zé)中間值的計(jì)算,而沒有后面這個(gè)值的設(shè)置過程,為了更方便地運(yùn)用,ObjectAnimator這個(gè)類誕生了,它繼承了ValueAnimator,并在內(nèi)部實(shí)現(xiàn)了設(shè)置到View屬性上的邏輯。
視圖動(dòng)畫相對(duì)于屬性動(dòng)畫來說簡(jiǎn)單一些,只能對(duì)view做移動(dòng)、旋轉(zhuǎn)、縮放等處理。舉例來說做View移動(dòng)的效果,視圖發(fā)生時(shí)改變View在屏幕上的繪制位置,但與這個(gè)View相關(guān)的屬性值卻不會(huì)改變,所以會(huì)發(fā)現(xiàn)響應(yīng)點(diǎn)擊事件還在原來的位置上,也就是看上去變了,實(shí)際上根還在原來的地方;而屬性動(dòng)畫改變的是實(shí)際的屬性值,也就是View位置發(fā)生變化了,他的相關(guān)屬性值也確實(shí)發(fā)生了改變。而且屬性動(dòng)畫可以改變已有的屬性類型,還可以改變自定義的類型,也就是說屬性動(dòng)畫是一種廣義的動(dòng)畫系統(tǒng),用于表現(xiàn)一種連續(xù)變化的過程,而不僅僅是視圖上的物理變化。
屬性動(dòng)畫
屬性動(dòng)畫主要涉及Animator、TimeInterpolator、TypeEvaluaor這三個(gè)概念。如果把屬性動(dòng)畫看作一臺(tái)機(jī)器,那么Animator就是其中的發(fā)動(dòng)機(jī)。它定義了屬性動(dòng)畫最基本的操作,ValueAnimator是它的子類,實(shí)現(xiàn)了動(dòng)畫發(fā)生的具體計(jì)算過程。值得注意的是,ValueAnimator只負(fù)責(zé)動(dòng)畫過程中屬性值得計(jì)算,具體得到這個(gè)變化的值如何處理ValueAnimator并不關(guān)心,所以需要使用者主動(dòng)去獲取計(jì)算好的屬性值。ValueAnimator提供了三種默認(rèn)支持的值類型,int、float和表示顏色的argb型。例如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f); animation.setDuration(1000); animation.start(); 要得到動(dòng)畫發(fā)生過程中的值需要給ValueAnimator設(shè)置一個(gè)監(jiān)聽器ValueAnimator.AnimatorUpdateListener。
animation.addUpdateListener(new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animator) { Float value = (Float) animator.getAnimatedValue(); } }) 這樣就可以得到整個(gè)動(dòng)畫過程產(chǎn)生的中間值。
中間值的計(jì)算涉及到兩個(gè)方面,一個(gè)是插值器函數(shù),也就是對(duì)應(yīng)的Interpolator,表示程度隨時(shí)間的變化情況,比如勻速、加速,或者先加速后減速等;另一個(gè)是中間值的計(jì)算函數(shù),對(duì)應(yīng)到TypeEvaluator,這是一個(gè)接口,里面有evaluate(float fraction, T startValue, T endValue)方法需要實(shí)現(xiàn),對(duì)一般的值計(jì)算方法都是startValue + fraction * (endValue - startValue),也有特殊的比如顏色值,用一個(gè)int表示了argb,計(jì)算的時(shí)候就要先分解計(jì)算再合成,但對(duì)于每個(gè)分量的計(jì)算任然遵守上面的規(guī)則,具體可以看ArgbEvaluator的源文件。
ValueAnimator除了上面的默認(rèn)值類型,還支持自定義類型Object,對(duì)于自定義類型,使用者需要實(shí)現(xiàn)該類型對(duì)應(yīng)的TypeEvaluator,如下
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue); animation.setDuration(1000); animation.start(); 屬性動(dòng)畫要對(duì)View起作用需要將每次改變的屬性值設(shè)置到相應(yīng)的View上,上面提到ValuAnimator只負(fù)責(zé)中間值的計(jì)算,而沒有后面這個(gè)值的設(shè)置過程,為了更方便地運(yùn)用,ObjectAnimator這個(gè)類誕生了,它繼承了ValueAnimator,并在內(nèi)部實(shí)現(xiàn)了設(shè)置到View屬性上的邏輯。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f); anim.setDuration(1000); anim.start(); 其中foo是屬性值所屬的一個(gè)具體對(duì)象,比如一個(gè)view,alpha是屬性名稱,ObjectAnimator要求必須有屬性名稱對(duì)應(yīng)到set和get方法,如上面例子要求foo對(duì)應(yīng)到類必須有setAlpha()和getAlpha()這兩個(gè)方法。對(duì)于View來說設(shè)置view的alpha值會(huì)觸發(fā)invalidate而重繪,因此就看到了連續(xù)的動(dòng)畫效果。
總結(jié)
以上是生活随笔為你收集整理的Android之属性动画初步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 之View绘图原理总结
- 下一篇: Android之DrawText详解