一:View動畫
簡介:View動畫通過對場景里的對象不斷做圖像變換(平移、縮放煌张、旋轉(zhuǎn)呐赡、透明度)從而產(chǎn)生動畫效果,是一種漸近式動畫骏融,并且View動畫支持自定義链嘀。
1.View動畫主要分為四類:TranslateAnimation,ScaleAnimation档玻,RotateAnimation怀泊,AlphaAnimation,可通過XML或者Java代碼聲明使用窃肠,動畫XML文件需要放在res/anim/filename.xml中。
例子:
<set xmlns:android="[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"
android:interpolator=""
android:shareInterpolator="["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
</set>
Java代碼:
// 使用Java代碼加載XML動畫
Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_test);
mButton.startAnimation(animation);
// 使用Java代碼創(chuàng)建動畫
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
2.View動畫既可以是單個動畫刷允,也可以由一系列動畫組成冤留。
3.幾個標簽解讀:
set:
表示動畫集合,對應(yīng)AnimationSet類树灶,它可以包含若干個動畫纤怒,并且它的內(nèi)部也是可以嵌套其他動畫集合的。
android:interpolator:
表示動畫集合所采用的插值器天通,什么是插值器呢泊窘?它影響動畫的速度,比如非勻速動畫就需要通過插值器來控制動畫的播放過程。屬性可不指定烘豹,默認為@android:anim/accelerate_decelerate_interpolator瓜贾,即加速減速插值器。
android:shareInterpolator:
表示集合中的動畫是否和集合共享同一個插值器携悯。如果集合不指定插值器祭芦,那么子動畫就需要單獨指定所需的插值器或者使用默認值。
其余的屬性網(wǎng)上都能查到憔鬼,這里就不詳細描述了龟劲。
二:屬性動畫
簡介:屬性動畫通過動態(tài)地改變相關(guān)對象的屬性,比如長寬等轴或,從而實現(xiàn)動畫效果昌跌,屬性動畫為API 11(Android 3.0)以上的新特性,在低版本無法直接使用屬性動畫照雁,但仍然可通過兼容庫(NineOldAndroids)去使用蚕愤。
屬性動畫有ValueAnimator、ObjectAnimator和AnimatorSet等概念囊榜。其中ObjectAnimator繼承自ValueAnimator审胸、AnimatorSet是動畫集合,可以定義一組動畫卸勺。
(1)使用
舉例:改變一個對象(myObject)的translationY屬性砂沛,讓其沿著Y軸上平移一段距離:
ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()).start();
(2)插值器和估值器:
屬性動畫有兩個新概念:
插值器:根據(jù)時間流逝的百分比來計算出屬性值改變的百分比,對應(yīng)的接口是Interpolator曙求;
估值器:根據(jù)屬性改變的百分比計算出屬性的改變值碍庵,對應(yīng)的接口是TypeEvaluator;
代碼設(shè)置:
ValueAnimator.setEvaluator(TypeEvaluator evaluator)
ValueAnimator.setInterpolator(TimeInterpolator value)
(3)屬性動畫的監(jiān)聽器
屬性動畫提供了監(jiān)聽器用于監(jiān)聽動畫的播放過程悟狱。主要有如下兩個接口:AnimatorUpdateListener和AnimatorListener静浴。
public static interface AnimatorListener {
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
它可以監(jiān)聽動畫的開始、結(jié)束挤渐、取消以及重復(fù)播放苹享。系統(tǒng)提供了AnimatorListener的適配器類AnimatorListenerAdapter。
AnimatorUpdateListener:
public static interface AnimatorUpdateListener {
void onAnimationUpdate(ValueAnimator animation);
}
AnimatorUpdateListener會監(jiān)聽整個動畫過程浴麻,動畫是由許多幀組成的得问,每播放一幀,onAnimationUpdate就會被調(diào)用一次软免。
(4)對任意屬性做動畫
屬性動畫的原理:屬性動畫要求動畫作用的對象提供該屬性的get和set方法宫纬,屬性動畫根據(jù)外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去調(diào)用set方法膏萧,每次傳遞給set方法的值都不一樣漓骚,確切地說是隨著時間的推移蝌衔,所傳遞的值越來越接近最終值。
總結(jié)蝌蹂,對object的屬性abc做動畫噩斟,需滿足條件:
(1)object必須提供setAbc方法,如果動畫的時候沒有傳遞初始值叉信,那么還要提供getAbc方法亩冬,因為系統(tǒng)要去取abc屬性的初始值;
(2)object的setAbc對屬性abc所做的改變必須能夠通過某種方法反映出來硼身,比如會帶來UI的改變硅急。
建議:
①、給對象加上get和set方法佳遂;
②营袜、用一個類來包裝原始對象,間接為其提供get和set方法丑罪;
③荚板、采用ValueAnimator,監(jiān)聽動畫過程吩屹,實現(xiàn)屬性的變化跪另。