最近工作稍微清閒點,以前發現自己關於動畫這塊特別的弱,抽空學習了下屬性動畫,先總結下。
屬性動畫 從文字含義上就知道,它是通過改變物件的屬性來實現動畫效果。
屬性動畫和補間動畫的區別:
1.補間動畫改變的物件只能是view,屬性動畫可以改變任何物件(對非view物件使用屬性動畫的場景還沒有遇到過,但確實可以)。
2.補間動畫只能改變"alpha","rotate","scale","translate"四個屬性,屬性動畫可以改變任何屬性(屬性必須有個set方法/get方法)。
屬性動畫的實現的步驟:
1.計算各幀對應的屬性值
2.為指定的物件指定計算後的值,並重新整理view
屬性動畫又是如何計算對頂額屬性值了?
這裡就得提到兩個概率。
一 是 計算器(evaluator),它是控制屬性動畫如何計算屬性值(屬性的型別可以是int,float,argb,自己定義的型別)。
對於int,float,argb型別anroid已經提供有現成的intevaluator、floatevaluator、argbevaluator計算器。對於沒有沒有
提供的型別,可以自己繼承type
evaluator 來自定義。
例如:public class mypointevaluator implements typeevaluator}二是
插值(interpolator) 可以理解為控制動畫的變化速度。android提供了幾種
—accelerateinterpolator:動畫從開始到結束,變化率是乙個加速的過程。
—decelerateinterpolator:動畫從開始到結束,變化率是乙個減速的過程。
—cycleinterpolator:動畫從開始到結束,變化率是迴圈給定次數的正弦曲線。
—acceleratedecelerateinterpolator:動畫從開始到結束,變化率是先加速後減速的過程。
—linearinterpolator:動畫從開始到結束,變化率是線性變化。
也可以自定義
interpolator,重寫
getinterpolation方法
public class myinterpolator implements interpolator@override
public float getinterpolation(float input)
return mfactor;} }
使用objectanimator實現動畫
objectanimator.offloat 改變屬性值為float型別的的方式 例如:objectanimator.offloat(m_tv, "x", width); //x為m_tv 的乙個屬性
objectanimator.ofint
改變屬性值為int型別的的方式
例如:objectanimator.offloat(m_tv, "y", width);
//y為m_tv 的乙個屬性
objectanimator.ofobject
改變屬性值為其他型別的的方式 objectanimator.ofobject(m_atv, "point",
new mypointevaluator(), new pointf(w, h), new pointf(x, y)); //
point 為
m_atv的型別為
pointf的屬性
objectanimator.ofpropertyvaluesholder 改變多個屬性值
當我們想一次改變物件的多個屬性的是時候使用
ofpropertyvaluesholder 方法。例如:
propertyvaluesholder pvhx = propertyvaluesholder.offloat("x", x1,x2);
propertyvaluesholder pvhy = propertyvaluesholder.offloat("y", y1,y2
); objectanimator oa = objectanimator.ofpropertyvaluesholder(m_tv, pvhx,
pvhy);
定義後 objectanimator
後直接呼叫start(),即可執行。
補充: 1.
propertyvaluesholder
的工廠方法裡面,除了整形ofint()、浮點型offloat()、object型別ofobject()之外,還有一種:ofkeyframe()。
每乙個keyframe還可以擁有自己的interpolator,控制了前乙個關鍵幀到這乙個關鍵幀之間的時間動畫行為。
乙個例如用關鍵幀定義左右搖擺的動畫
propertyvaluesholder pvhtranslatex = propertyvaluesholder.ofkeyframe(view.translation_x,keyframe.offloat(0f, 0),
keyframe.offloat(.10f, -delta),
keyframe.offloat(.26f, delta),
keyframe.offloat(.42f, -delta),
keyframe.offloat(.58f, delta),
keyframe.offloat(.74f, -delta),
keyframe.offloat(.90f, delta),
keyframe.offloat(1f, 0f)
objectanimator.ofpropertyvaluesholder(view, pvhtranslatex).setduration(500);
2.
如果動畫的物件是view,為了能顯示動畫效果,可能還需要在onanimationupdate()事件中監聽呼叫view.invalidate()方法來重新整理螢幕顯示。但是view的定義的setter方法,
如setalapha(),settranslationx()等方法,都會自動呼叫invalidate()方法,不需要額外的呼叫
invalidate方法。
Android動畫 屬性動畫總結(一)
屬性動畫是api 11 才引入的新特性,屬性動畫彌補了view動畫的一些不足。屬性動畫可以針對屬性進行動畫而不僅僅是view。但並不是傳遞任何的屬性都能有效果。屬性動畫要求做動畫的物件提供該屬性的get和set方法,屬性動畫根據外界傳遞的該屬性的初始值和最終值,以動畫的效果多次呼叫set方法。屬性動...
android屬性動畫
一 屬性動畫的工作原理,主要有三個步驟 1 計算時間流逝。android動畫系統呼叫,用0 1代表時間的流逝。0表示經過0 的時間,1表示經過100 的時間。2 根據timeinterpolator計算出乙個差值因素。timeinterpolator以第1步流逝的時間作為引數,根據運動規則得出另乙個...
android 屬性動畫
package com.example.objectanimator import android.animation.animator import android.animation.animatorlisteneradapter import android.animation.animato...