Android View動(dòng)畫和屬性動(dòng)畫簡(jiǎn)單解析:

一: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)屬性的變化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容