動畫機制總結

Animation 動畫類型php

目錄介紹

  • 1.Android動畫類型
  • 1.1 Android動畫類型分類
  • 1.2 Android動畫實現方式分類
  • 1.3 按照時間分類
  • 2.Android逐幀動畫
  • 2.1 逐幀動畫簡單介紹
  • 2.2 逐幀動畫XML資源文件方式
  • 2.3 逐幀動畫代碼方式
  • 3.Android補間動畫
  • 3.1 補間動畫簡單介紹
  • 3.2 差值器
  • 3.3 AplhaAnimation
  • 3.4 ScaleAnimation
  • 3.5 TranslateAnimation
  • 3.6 RotateAnimation
  • 3.7 自定義補間動畫
  • 3.8 動畫監聽器
  • 4.Android屬性動畫
  • 4.1 屬性動畫基本介紹
  • 4.2 Evaluator
  • 4.3 AnimatorSet
  • 4.4 ValueAnimator
  • 4.5 ObjectAnimator
  • 4.6 ValueAnimator與ObjectAnimator區別
  • 4.7 監聽動畫器
  • 5.Android過渡動畫
  • 5.1 過渡動畫簡單介紹
  • 5.2 過渡動畫的代碼運用
  • 6.Android動畫框架原理解析
  • 6.1 關於補間動畫原理
  • 7.關於其餘
  • 7.1 參考案例
  • 7.2 關於本篇博客更新日誌
  • 7.3 關於個人博客

0.本人寫的綜合案例

  • 案例
  • 說明及截圖
  • 模塊:新聞,音樂,視頻,圖片,唐詩宋詞,快遞,天氣,記事本,閱讀器等等
  • 接口:七牛,阿里雲,天行,乾貨集中營,極速數據,追書神器等等
  • 持續更新目錄說明

1.Android動畫類型

1.1 Android動畫類型分類
  • 逐幀動畫【Frame Animation】,即順序播放事先作好的圖像,跟電影相似
  • 補間動畫【Tween Animation】,即經過對場景裏的對象不斷作圖像變換 ( 平移、縮放、旋轉 ) 產生動畫效果
  • 屬性動畫【Property Animation】,補間動畫加強版,支持對對象執行動畫
  • 過渡動畫【Transition Animation】,實現Activity或View過渡動畫效果
1.2 Android動畫實現方式分類
  • XML資源文件
  • 代碼方式
1.3 按照時間分類
  • Android 3.0以前版本,逐幀動畫,補間動畫
  • Android 3.0以後版本,屬性動畫
  • Android 4.4中,過渡動畫

2.Android逐幀動畫

2.1 逐幀動畫簡單介紹
  • 也叫Drawable Animation動畫,是最簡單最直觀動畫類型
2.2 逐幀動畫XML資源文件方式
  • 這個是最經常使用的方式,在res/drawable目錄下新建動畫XML文件,以下所示
  • android:oneshot用來控制動畫是否循環播放,true表示不會循環播放,false表示會循環播放
  • android:duration="200"表示每一幀持續播放的時間
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@mipmap/audio_anim_01" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_02" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_03" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_04" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_05" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_06" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_07" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_08" android:duration="200" />
    <item android:drawable="@mipmap/audio_anim_09" android:duration="200" />
</animation-list>
2.3 逐幀動畫代碼方式
  • 代碼方式用的少,以下所示
AnimationDrawable drawable = new AnimationDrawable();
for(int a=0 ; a<9 ; a++){
    int id = getResources().getIdentifier("audio_anim_0" + a, "mipmap", getPackageName());
    Drawable da = getResources().getDrawable(id);
    drawable.addFrame(da,200);
}
ivVisualEffect.setBackground(drawable);
drawable.setOneShot(false);
//獲取對象實例,用來控制播放與中止
AnimationDrawable rocketAnimation = (AnimationDrawable) ivVisualEffect.getBackground();
rocketAnimation.start();    // 開啓幀動畫
rocketAnimation.stop();     // 中止動畫

3.Android補間動畫

3.1 補間動畫簡單介紹
  • 無需關注每一幀,只須要定義動畫開始與結束兩個關鍵幀,並指定動畫變化的時間與方式等
  • 主要有四種基本的效果

透明度變化
大小縮放變化
位移變化
旋轉變化java

  • 表現形式
  • XML中
alph                   漸變透明度動畫效果
scale                  漸變尺寸伸縮動畫效果
translate              畫面轉換位置移動動畫效果
rotate                 畫面轉移旋轉動畫效果
  • JavaCode中
AlphaAnimation         漸變透明度動畫效果
ScaleAnimation         漸變尺寸伸縮動畫效果
TranslateAnimation     畫面轉換位置移動動畫效果
RotateAnimation        畫面轉移旋轉動畫效果
3.2 差值器
  • Android系統會在補間動畫開始和結束關鍵幀之間插入漸變值,它依據差值器。
  • Interpolator 時間插值類,定義動畫變換的速度。可以實現alpha/scale/translate/rotate動畫的加速、減速和重複等。Interpolator類實際上是一個空接口,繼承自TimeInterpolator,TimeInterpolator時間插值器容許動畫進行非線性運動變換,如加速和限速等,該接口中只有接口中有一個方法 float getInterpolation(float input)這個方法。傳入的值是一個0.0~1.0的值,返回值能夠小於0.0也能夠大於1.0。
  • 提供幾個Interpolator的實現類
AccelerateInterpolator 加速,開始時慢中間加速
DecelerateInterpolator 減速,開始時快而後減速
AccelerateDecelerateInterolator 先加速後減速,開始結束時慢,中間加速
AnticipateInterpolator 反向,先向相反方向改變一段再加速播放
AnticipateOvershootInterpolator 反向加超越,先向相反方向改變,再加速播放,會超出目的值而後緩慢移動至目的值
BounceInterpolator 跳躍,快到目的值時值會跳躍,如目的值100,後面的值可能依次爲85,77,70,80,90,100
CycleIinterpolator 循環,動畫循環必定次數,值的改變爲一正弦函數:Math.sin(2* mCycles* Math.PI* input)
LinearInterpolator 線性,線性均勻改變
OvershootInterpolator超越,最後超出目的值而後緩慢改變到目的值
PathInterpolator新增的,就是能夠定義路徑座標,而後能夠按照路徑座標來跑動;注意其座標並非 XY,而是單方向,也就是我能夠從0~1,而後彈回0.5 而後又彈到0.7 有到0.3,直到最後時間結束。
3.3 AplhaAnimation
  • 第一種方式:XML方式,以下所示
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <alpha
        android:duration="1000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
    <!--
    透明度控制動畫效果 alpha
    浮點型值:
    fromAlpha 屬性爲動畫起始時透明度
    toAlpha   屬性爲動畫結束時透明度
    說明:
    0.0表示徹底透明
    1.0表示徹底不透明
    以上值取0.0-1.0之間的float數據類型的數字
    長整型值:
    duration  屬性爲動畫持續時間
    說明:時間以毫秒爲單位
    -->
</set>
  • 第二種方式:代碼方式
AlphaAnimation alpha = new AlphaAnimation(0, 1);
alpha.setDuration(500);          //設置持續時間
alpha.setFillAfter(true);                   //動畫結束後保留結束狀態
alpha.setInterpolator(new AccelerateInterpolator());        //添加差值器
ivImage.setAnimation(alpha);
3.4 ScaleAnimation
  • 第一種方式:XML資源文件方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <scale
        android:duration="1000"
        android:fillAfter="false"
        android:fromXScale="0.0"
        android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.4"
        android:toYScale="1.4" />
    <!--
    尺寸伸縮動畫效果 scale
    屬性:interpolator 指定一個動畫的插入器
    在我試驗過程當中,使用android.res.anim中的資源時候發現
    有三種動畫插入器:
    accelerate_decelerate_interpolator  加速-減速 動畫插入器
    accelerate_interpolator             加速-動畫插入器
    decelerate_interpolator             減速- 動畫插入器
    其餘的屬於特定的動畫效果
    浮點型值:
    fromXScale 屬性爲動畫起始時 X座標上的伸縮尺寸
    toXScale   屬性爲動畫結束時 X座標上的伸縮尺寸
    fromYScale 屬性爲動畫起始時Y座標上的伸縮尺寸
    toYScale   屬性爲動畫結束時Y座標上的伸縮尺寸
    說明:
    以上四種屬性值
    0.0表示收縮到沒有
    1.0表示正常無伸縮
    值小於1.0表示收縮
    值大於1.0表示放大
    pivotX     屬性爲動畫相對於物件的X座標的開始位置
    pivotY     屬性爲動畫相對於物件的Y座標的開始位置
    說明:
    以上兩個屬性值 從0%-100%中取值
    50%爲物件的X或Y方向座標上的中點位置
    長整型值:
    duration  屬性爲動畫持續時間
    說明:   時間以毫秒爲單位
    布爾型值:
    fillAfter 屬性 當設置爲true ,該動畫轉化在動畫結束後被應用
    -->
</set>
  • 第二種方式:代碼方式
ScaleAnimation scale = new ScaleAnimation(1.0f, scaleXY, 1.0f, scaleXY, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scale.setDuration(durationMillis);
scale.setFillAfter(true);
ivImage.setAnimation(scale);
3.5 TranslateAnimation
  • 第一種方式:XML資源文件方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="2000"
        android:fromXDelta="30"
        android:fromYDelta="30"
        android:toXDelta="-80"
        android:toYDelta="300" />
    <!--
    translate 位置轉移動畫效果
    整型值:
    fromXDelta 屬性爲動畫起始時 X座標上的位置
    toXDelta   屬性爲動畫結束時 X座標上的位置
    fromYDelta 屬性爲動畫起始時 Y座標上的位置
    toYDelta   屬性爲動畫結束時 Y座標上的位置
    注意:
     沒有指定fromXType toXType fromYType toYType 時候,
     默認是以本身爲相對參照物
    長整型值:
    duration  屬性爲動畫持續時間
    說明:   時間以毫秒爲單位
    -->
</set>
  • 第二種方式:代碼方式
TranslateAnimation translate = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
translate.setDuration(durationMillis);
translate.setFillAfter(true);
ivImage.setAnimation(translate);
3.6 RotateAnimation
  • 第一種方式:XML方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <rotate
        android:duration="3000"
        android:fromDegrees="0" android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+350" />
    <!--
    rotate 旋轉動畫效果
    屬性:interpolator 指定一個動畫的插入器
    在我試驗過程當中,使用android.res.anim中的資源時候發現
    有三種動畫插入器:
    accelerate_decelerate_interpolator    加速-減速 動畫插入器
    accelerate_interpolator              加速-動畫插入器
    decelerate_interpolator              減速- 動畫插入器
    其餘的屬於特定的動畫效果
    浮點數型值:
    fromDegrees 屬性爲動畫起始時物件的角度
    toDegrees  屬性爲動畫結束時物件旋轉的角度 能夠大於360度
    說明:
    當角度爲負數-表示逆時針旋轉
    當角度爲正數-表示順時針旋轉
    (負數from-to正數:順時針旋轉)
    (負數from-to負數:逆時針旋轉)
    (正數from-to正數:順時針旋轉)
    (正數from-to負數:逆時針旋轉)
    pivotX    屬性爲動畫相對於物件的X座標的開始位置
    pivotY    屬性爲動畫相對於物件的Y座標的開始位置
    說明:        以上兩個屬性值 從0%-100%中取值    50%爲物件的X或Y方向座標上的中點位置
    長整型值:
    duration  屬性爲動畫持續時間
    說明:      時間以毫秒爲單位
    -->
</set>
  • 第二種方式:代碼方式
RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(durationMillis);
rotate.setFillAfter(true);
ivImage.setAnimation(rotate);
3.7 自定義補間動畫

4.Android屬性動畫

4.1 屬性動畫基本介紹
  • 補間動畫加強版本,補間動畫存在一些缺點
  • a.做用對象侷限:View 。即補間動畫 只可以做用在視圖View上,即只能夠對一個Button、TextView、甚至是LinearLayout、或者其它繼承自View的組件進行動畫操做,但沒法對非View的對象進行動畫操做
  • b.沒有改變View的屬性,只是改變視覺效果
  • c.動畫效果單一
  • 屬性動畫特色
  • 做用對象:任意 Java 對象,再也不侷限於 視圖View對象
  • 實現的動畫效果:可自定義各類動畫效果,再也不侷限於4種基本變換:平移、旋轉、縮放 & 透明度
  • 基本工做原理
  • 在必定時間間隔內,經過不斷對值進行改變,並不斷將該值賦給對象的屬性,從而實現該對象在該屬性上的動畫效果
  • 屬性動畫基類:Animator,抽象類。子類有
  • 兩個重要的類:ValueAnimator 類 & ObjectAnimator 類
  • 其餘類:Evaluator類,AnimatorSet類
  • 關於經常使用屬性動畫類總結以下圖所示
4.2 Evaluator
  • 估值器(TypeEvaluator)做用
  • 設置動畫 如何從初始值過渡到結束值的邏輯
  • 插值器(Interpolator)決定值的變化模式(勻速、加速blabla)
  • 估值器(TypeEvaluator)決定值的具體變化數值
  • 看看接口TypeEvaluator 源代碼
public interface TypeEvaluator<T> {
    public T evaluate(float fraction, T startValue, T endValue);
}

看看如何實現估值器android

public static ValueAnimator ofArgb(int... values) {
    ValueAnimator anim = new ValueAnimator();
    anim.setIntValues(values);
    anim.setEvaluator(ArgbEvaluator.getInstance());
    return anim;
}
//--------------------
public class ArgbEvaluator implements TypeEvaluator {
    private static final ArgbEvaluator sInstance = new ArgbEvaluator();
    public static ArgbEvaluator getInstance() {
        return sInstance;
    }
    // FloatEvaluator實現了TypeEvaluator接口
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        // 參數說明
        // fraction:表示動畫完成度(根據它來計算當前動畫的值)
        // startValue、endValue:動畫的初始值和結束值
        int startInt = (Integer) startValue;
        int startA = (startInt >> 24) & 0xff;
        int startR = (startInt >> 16) & 0xff;
        int startG = (startInt >> 8) & 0xff;
        int startB = startInt & 0xff;
        int endInt = (Integer) endValue;
        int endA = (endInt >> 24) & 0xff;
        int endR = (endInt >> 16) & 0xff;
        int endG = (endInt >> 8) & 0xff;
        int endB = endInt & 0xff;
        // 初始值 過渡 到結束值 的算法是:
        // 1. 用結束值減去初始值,算出它們之間的差值
        // 2. 用上述差值乘以fraction係數
        // 3. 再加上初始值,就獲得當前動畫的值
        return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
                (int)((startR + (int)(fraction * (endR - startR))) << 16) |
                (int)((startG + (int)(fraction * (endG - startG))) << 8) |
                (int)((startB + (int)(fraction * (endB - startB))));
    }
}
4.3 AnimatorSet
  • 特色
  • 單一動畫實現的效果至關有限,更多的使用場景是同時使用多種動畫效果,即組合動畫
  • 使用方法
  • 第一種方式:xml方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >
    <!--表示Set集合內的動畫按順序進行-->
    <!--ordering的屬性值:sequentially & together-->
    <!--sequentially:表示set中的動畫,按照前後順序逐步進行(a 完成以後進行 b )-->
    <!--together:表示set中的動畫,在同一時間同時進行,爲默認值-->
    <set android:ordering="together" >
        <!--下面的動畫同時進行-->
        <objectAnimator
            android:duration="2000"
            android:propertyName="translationX"
            android:valueFrom="0"
            android:valueTo="300"
            android:valueType="floatType" >
        </objectAnimator>
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" >
        </objectAnimator>
    </set>
    <set android:ordering="sequentially" >
        <!--下面的動畫按序進行-->
        <objectAnimator
            android:duration="1500"
            android:propertyName="alpha"
            android:valueFrom="1"
            android:valueTo="0"
            android:valueType="floatType" >
        </objectAnimator>
        <objectAnimator
            android:duration="1500"
            android:propertyName="alpha"
            android:valueFrom="0"
            android:valueTo="1"
            android:valueType="floatType" >
        </objectAnimator>
    </set>
</set>
//關於代碼中引用
AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animation);
// 建立組合動畫對象  &  加載XML動畫
animator.setTarget(mButton);
// 設置動畫做用對象
animator.start();
// 啓動動畫
  • 第二種方式:Java方式
// 步驟1:設置須要組合的動畫效果
ObjectAnimator translation = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX); 
// 平移動畫
ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f); 
// 旋轉動畫
ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f); 
// 透明度動畫
// 步驟2:建立組合動畫的對象
AnimatorSet animSet = new AnimatorSet(); 
// 步驟3:根據需求組合動畫
animSet.play(translation).with(rotate).before(alpha); 
animSet.setDuration(5000); 
// 步驟4:啓動動畫
animSet.start();
  • 經常使用方法
AnimatorSet.play(Animator anim)   :播放當前動畫
AnimatorSet.after(long delay)   :將現有動畫延遲x毫秒後執行
AnimatorSet.with(Animator anim)   :將現有動畫和傳入的動畫同時執行
AnimatorSet.after(Animator anim)   :將現有動畫插入到傳入的動畫以後執行
AnimatorSet.before(Animator anim) :  將現有動畫插入到傳入的動畫以前執行
4.4 ValueAnimator
  • 基本做用
  • 將初始值 以整型數值的形式 過渡到結束值 。即估值器是整型估值器 - IntEvaluator

ValueAnimator.oFloat()採用默認的浮點型估值器 (FloatEvaluator)
ValueAnimator.ofInt()採用默認的整型估值器(IntEvaluator)git

  • 第一種實現方式:Java設置
public static ValueAnimator setValueAnimator(View view , int start , int end , int time , int delay , int count){
    // 步驟1:設置動畫屬性的初始值 & 結束值
    ValueAnimator mAnimator = ValueAnimator.ofInt(start, end);
    // ofInt()做用有兩個
    // 1. 建立動畫實例
    // 2. 將傳入的多個Int參數進行平滑過渡:此處傳入0和1,表示將值從0平滑過渡到1
    // 若是傳入了3個Int參數 a,b,c ,則是先從a平滑過渡到b,再從b平滑過渡到C,以此類推
    // ValueAnimator.ofInt()內置了整型估值器,直接採用默認的.不須要設置,即默認設置瞭如何從初始值 過渡到 結束值
    // 關於自定義插值器我將在下節進行講解
    // 下面看看ofInt()的源碼分析 ->>關注1
    mAnimator.setTarget(view);
    // 步驟2:設置動畫的播放各類屬性
    mAnimator.setDuration(time);
    // 設置動畫運行的時長
    mAnimator.setStartDelay(delay);
    // 設置動畫延遲播放時間
    mAnimator.setRepeatCount(count);
    // 設置動畫重複播放次數 = 重放次數+1
    // 動畫播放次數 = infinite時,動畫無限重複
    mAnimator.setRepeatMode(ValueAnimator.RESTART);
    // 設置重複播放動畫模式
    // ValueAnimator.RESTART(默認):正序重放
    // ValueAnimator.REVERSE:倒序回放
    // 步驟3:將改變的值手動賦值給對象的屬性值:經過動畫的更新監聽器
    // 設置 值的更新監聽器
    // 即:值每次改變、變化一次,該方法就會被調用一次
    return mAnimator;
}
//-------
Button b1 = (Button) findViewById(R.id.b1);
ValueAnimator valueAnimator = AnimatorUtils.setValueAnimator(b1,0, 2, 2000, 500, 2);
valueAnimator.start();
  • 第二種實現方式:XML設置
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <animator
        android:valueFrom="0"
        android:valueTo="100"
        android:valueType="intType"
        android:duration="3000"
        android:startOffset ="1000"
        android:fillBefore = "true"
        android:fillAfter = "false"
        android:fillEnabled= "true"
        android:repeatMode= "restart"
        android:repeatCount = "0" android:interpolator="@android:anim/accelerate_interpolator"/>
        <!--初始值-->
        <!--結束值-->
        <!--變化值類型 :floatType & intType-->
        <!--動畫持續時間(ms),必須設置,動畫纔有效果-->
        <!--動畫延遲開始時間(ms)-->
        <!--動畫播放完後,視圖是否會停留在動畫開始的狀態,默認爲true-->
        <!--動畫播放完後,視圖是否會停留在動畫結束的狀態,優先於fillBefore值,默認爲false-->
        <!--是否應用fillBefore值,對fillAfter值無影響,默認爲true-->
        <!--選擇重複播放動畫模式,restart表明正序重放,reverse表明倒序回放,默認爲restart|-->
        <!--重放次數(因此動畫的播放次數=重放次數+1),爲infinite時無限重複-->
        <!--插值器,即影響動畫的播放速度,下面會詳細講-->
</set>
//代碼引用
Button b3 = (Button) findViewById(R.id.b3);
Animator mAnim = AnimatorInflater.loadAnimator(this, R.animator.animator_1_0);
mAnim.setTarget(b3);
mAnim.start();
4.5 ObjectAnimator
  • 基本的原理
  • 直接對對象的屬性值進行改變操做,從而實現動畫效果

繼承自ValueAnimator類,即底層的動畫實現機制是基於ValueAnimator類github

  • 第一種實現方式:Java設置
public static ObjectAnimator setObjectAnimator(View view , String type , int start , int end , long time){
    ObjectAnimator mAnimator = ObjectAnimator.ofFloat(view, type, start, end);
    // ofFloat()做用有兩個
    // 1. 建立動畫實例
    // 2. 參數設置:參數說明以下
    // Object object:須要操做的對象
    // String property:須要操做的對象的屬性
    // float ....values:動畫初始值 & 結束值(不固定長度)
    // 如果兩個參數a,b,則動畫效果則是從屬性的a值到b值
    // 如果三個參數a,b,c,則則動畫效果則是從屬性的a值到b值再到c值
    // 以此類推
    // 至於如何從初始值 過渡到 結束值,一樣是由估值器決定,此處ObjectAnimator.ofFloat()是有系統內置的浮點型估值器FloatEvaluator,同ValueAnimator講解

    // 設置動畫重複播放次數 = 重放次數+1
    // 動畫播放次數 = infinite時,動畫無限重複
    mAnimator.setRepeatCount(ValueAnimator.INFINITE);
    // 設置動畫運行的時長
    mAnimator.setDuration(time);
    // 設置動畫延遲播放時間
    mAnimator.setStartDelay(0);
    // 設置重複播放動畫模式
    mAnimator.setRepeatMode(ValueAnimator.RESTART);
    // ValueAnimator.RESTART(默認):正序重放
    // ValueAnimator.REVERSE:倒序回放
    //設置差值器
    mAnimator.setInterpolator(new LinearInterpolator());
    return mAnimator;
}
  • 關於preperty的屬性值有,以下表所示
  • 第二種方式:XML方式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <ObjectAnimator
        android:valueFrom="1"
        android:valueTo="0"
        android:valueType="floatType"
        android:duration = "800"
        android:propertyName="alpha"/>
</set>
Animator mAnim = AnimatorInflater.loadAnimator(this, R.animator.animator_1_0);
mAnim.setTarget(fabHomeRandom);
mAnim.start();
  • 注意,以XML方式,res的文件夾名稱必須是animator,不然沒法引用,以下所示:
4.6 ValueAnimator與ObjectAnimator區別
  • ValueAnimator 類是先改變值,而後手動賦值 給對象的屬性從而實現動畫;是間接對對象屬性進行操做;
  • ObjectAnimator 類是先改變值,而後自動賦值 給對象的屬性從而實現動畫;是直接對對象屬性進行操做;
4.7 監聽動畫器
  • 說明
  • Animation類經過監聽動畫開始 / 結束 / 重複 / 取消時刻來進行一系列操做,如跳轉頁面等等

經過在Java代碼裏addListener()設置
因Animator類、AnimatorSet類、ValueAnimator、ObjectAnimator類存在繼承關係,因此AnimatorSet類、ValueAnimator、ObjectAnimator均可以使用addListener()監聽器進行動畫監聽算法

  • 看看第一種監聽方式
mAnim.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        //動畫開始時執行
    }
    @Override
    public void onAnimationEnd(Animator animation) {
        //動畫結束時執行
    }
    @Override
    public void onAnimationCancel(Animator animation) {
        //動畫取消時執行
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
        //動畫重複時執行
    }
});
  • 看看這二中監聽方式
mAnim2.addListener(new AnimatorListenerAdapter() {
    // 向addListener()方法中傳入適配器對象AnimatorListenerAdapter()
    // 因爲AnimatorListenerAdapter中已經實現好每一個接口
    // 因此這裏不實現所有方法也不會報錯
    @Override
    public void onAnimationCancel(Animator animation) {
        super.onAnimationCancel(animation);
        ToastUtils.showShort("動畫結束了");
    }
});

6.Android動畫框架原理解析

6.1 關於補間動畫原理
  • 要了解Android動畫是如何加載出來的,咱們首先要了解Android View 是如何組織在一塊兒的.每一個窗口是一顆View樹. RootView是DecorView,在佈局文件中聲明的佈局都是DecorView的子View.是經過setContentView來設置進入窗口內容的. 由於View的佈局就是一棵樹.因此繪製的時候也是按照樹形結構來遍歷每一個View進行繪製.ViewRoot.java中 draw函數準備好Canvas後 調用 mView.draw(canvas),這裏的mView是DecorView.
  • 下面看一下遞歸繪製的幾個步驟:
  • 1.繪製背景
  • 2.若是須要,保存畫布(canvas),爲淡入淡出作準備
  • 3.經過調用View.onDraw(canvas)繪製View自己的內容
  • 4.經過 dispatchDraw(canvas)繪製本身的孩子,dispatchDraw->drawChild->child.draw(canvas) 這樣的調用過程被用來保證每一個子 View 的 draw 函數都被調用
  • 5.若是須要,繪製淡入淡出相關的內容並恢復保存的畫布所在的層(layer)
  • 6.繪製修飾的內容(例如滾動條)
  • 當一個 ChildView 要重畫時,它會調用其成員函數 invalidate() 函數將通知其 ParentView 這個 ChildView 要重畫,這個過程一直向上遍歷到 ViewRoot,當 ViewRoot 收到這個通知後就會調用上面提到的 ViewRoot 中的 draw 函數從而完成繪製。Android 動畫就是經過 ParentView 來不斷調整 ChildView 的畫布座標系來實現的

7.關於其餘

7.1 參考案例
7.2 關於本篇博客更新日誌
  • v1.0.0 16年8月11日,更新幀動畫和補間動畫
  • v1.0.1 17年3月7日,更新了屬性動畫
  • v1.0.2 17年11月29日,參考 Carson_Ho博客,更新了屬性動畫部分
7.3 關於個人博客
相關文章
相關標籤/搜索