一:View動(dòng)畫
簡(jiǎn)介:View動(dòng)畫通過(guò)對(duì)場(chǎng)景里的對(duì)象不斷做圖像變換(平移、縮放、旋轉(zhuǎn)、透明度)從而產(chǎn)生動(dòng)畫效果,是一種漸近式動(dòng)畫,并且View動(dòng)畫支持自定義。
1.View動(dòng)畫主要分為四類:TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation,可通過(guò)XML或者Java代碼聲明使用,動(dòng)畫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動(dòng)畫
Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_test);
mButton.startAnimation(animation);
// 使用Java代碼創(chuàng)建動(dòng)畫
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
2.View動(dòng)畫既可以是單個(gè)動(dòng)畫,也可以由一系列動(dòng)畫組成。
3.幾個(gè)標(biāo)簽解讀:
set:
表示動(dòng)畫集合,對(duì)應(yīng)AnimationSet類,它可以包含若干個(gè)動(dòng)畫,并且它的內(nèi)部也是可以嵌套其他動(dòng)畫集合的。
android:interpolator:
表示動(dòng)畫集合所采用的插值器,什么是插值器呢?它影響動(dòng)畫的速度,比如非勻速動(dòng)畫就需要通過(guò)插值器來(lái)控制動(dòng)畫的播放過(guò)程。屬性可不指定,默認(rèn)為@android:anim/accelerate_decelerate_interpolator,即加速減速插值器。
android:shareInterpolator:
表示集合中的動(dòng)畫是否和集合共享同一個(gè)插值器。如果集合不指定插值器,那么子動(dòng)畫就需要單獨(dú)指定所需的插值器或者使用默認(rèn)值。
其余的屬性網(wǎng)上都能查到,這里就不詳細(xì)描述了。
二:屬性動(dòng)畫
簡(jiǎn)介:屬性動(dòng)畫通過(guò)動(dòng)態(tài)地改變相關(guān)對(duì)象的屬性,比如長(zhǎng)寬等,從而實(shí)現(xiàn)動(dòng)畫效果,屬性動(dòng)畫為API 11(Android 3.0)以上的新特性,在低版本無(wú)法直接使用屬性動(dòng)畫,但仍然可通過(guò)兼容庫(kù)(NineOldAndroids)去使用。
屬性動(dòng)畫有ValueAnimator、ObjectAnimator和AnimatorSet等概念。其中ObjectAnimator繼承自ValueAnimator、AnimatorSet是動(dòng)畫集合,可以定義一組動(dòng)畫。
(1)使用
舉例:改變一個(gè)對(duì)象(myObject)的translationY屬性,讓其沿著Y軸上平移一段距離:
ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()).start();
(2)插值器和估值器:
屬性動(dòng)畫有兩個(gè)新概念:
插值器:根據(jù)時(shí)間流逝的百分比來(lái)計(jì)算出屬性值改變的百分比,對(duì)應(yīng)的接口是Interpolator;
估值器:根據(jù)屬性改變的百分比計(jì)算出屬性的改變值,對(duì)應(yīng)的接口是TypeEvaluator;
代碼設(shè)置:
ValueAnimator.setEvaluator(TypeEvaluator evaluator)
ValueAnimator.setInterpolator(TimeInterpolator value)
(3)屬性動(dòng)畫的監(jiān)聽器
屬性動(dòng)畫提供了監(jiān)聽器用于監(jiān)聽動(dòng)畫的播放過(guò)程。主要有如下兩個(gè)接口:AnimatorUpdateListener和AnimatorListener。
public static interface AnimatorListener {
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
它可以監(jiān)聽動(dòng)畫的開始、結(jié)束、取消以及重復(fù)播放。系統(tǒng)提供了AnimatorListener的適配器類AnimatorListenerAdapter。
AnimatorUpdateListener:
public static interface AnimatorUpdateListener {
void onAnimationUpdate(ValueAnimator animation);
}
AnimatorUpdateListener會(huì)監(jiān)聽整個(gè)動(dòng)畫過(guò)程,動(dòng)畫是由許多幀組成的,每播放一幀,onAnimationUpdate就會(huì)被調(diào)用一次。
(4)對(duì)任意屬性做動(dòng)畫
屬性動(dòng)畫的原理:屬性動(dòng)畫要求動(dòng)畫作用的對(duì)象提供該屬性的get和set方法,屬性動(dòng)畫根據(jù)外界傳遞的該屬性的初始值和最終值,以動(dòng)畫的效果多次去調(diào)用set方法,每次傳遞給set方法的值都不一樣,確切地說(shuō)是隨著時(shí)間的推移,所傳遞的值越來(lái)越接近最終值。
總結(jié),對(duì)object的屬性abc做動(dòng)畫,需滿足條件:
(1)object必須提供setAbc方法,如果動(dòng)畫的時(shí)候沒(méi)有傳遞初始值,那么還要提供getAbc方法,因?yàn)橄到y(tǒng)要去取abc屬性的初始值;
(2)object的setAbc對(duì)屬性abc所做的改變必須能夠通過(guò)某種方法反映出來(lái),比如會(huì)帶來(lái)UI的改變。
建議:
①、給對(duì)象加上get和set方法;
②、用一個(gè)類來(lái)包裝原始對(duì)象,間接為其提供get和set方法;
③、采用ValueAnimator,監(jiān)聽動(dòng)畫過(guò)程,實(shí)現(xiàn)屬性的變化。