1. 程式人生 > >Android 屬性動畫:屬性動畫 總結&攻略

Android 屬性動畫:屬性動畫 總結&攻略

轉載:http://blog.csdn.net/carson_ho/article/details/72909894

更多內容請參考: 1. 屬性動畫1:基礎知識和ValueAnimator:http://blog.csdn.net/wangxiaocheng16/article/details/73951049 http://blog.csdn.net/wangxiaocheng16/article/details/74202424

前言

  • 動畫的使用 是 Android 開發中常用的知識
  • 本文將詳細介紹 Android 動畫中 屬性動畫的原理 & 使用

動畫型別

目錄

目錄

1. 屬性動畫出現的原因

  • 屬性動畫(Property Animation)是在 Android 3.0API 11)後才提供的一種全新動畫模式
  • 那麼為什麼要提供屬性動畫(Property Animation)?

1.1 背景

實現動畫效果在Android開發中非常常見,因此Android系統一開始就提供了兩種實現動畫的方式:

  • 逐幀動畫(Frame Animation
  • 補間動畫( Tweened animation )

1.2 問題

逐幀動畫 & 補間動畫存在一定的缺點:

a. 作用物件侷限:View

即補間動畫 只能夠作用在檢視View

上,即只可以對一個ButtonTextView、甚至是LinearLayout、或者其它繼承自View的元件進行動畫操作,但無法對非View的物件進行動畫操作

  1. 有些情況下的動畫效果只是檢視的某個屬性 & 物件而不是整個檢視;
  2. 如,現需要實現檢視的顏色動態變化,那麼就需要操作檢視的顏色屬性從而實現動畫效果,而不是針對整個檢視進行動畫操作
b. 沒有改變View的屬性,只是改變視覺效果
  • 補間動畫只是改變了View的視覺效果,而不會真正去改變View的屬性。
  • 如,將螢幕左上角的按鈕 通過補間動畫 移動到螢幕的右下角
  • 點選當前按鈕位置(螢幕右下角)是沒有效果的,因為實際上按鈕還是停留在螢幕左上角,補間動畫只是將這個按鈕繪製到螢幕右下角,改變了視覺效果而已。
c. 動畫效果單一
  • 補間動畫只能實現平移、旋轉、縮放 & 透明度這些簡單的動畫需求
  • 一旦遇到相對複雜的動畫效果,即超出了上述4種動畫效果,那麼補間動畫則無法實現。 
    即在功能 & 可擴充套件性有較大侷限性

1.3 問題

  • 為了解決補間動畫的缺陷,在 Android 3.0(API 11)開始,系統提供了一種全新的動畫模式:屬性動畫(Property Animation
  • 下面,我將全面介紹屬性動畫(Property Animation

2. 簡介

  • 作用物件:任意 Java 物件 

    不再侷限於 檢視View物件

  • 實現的動畫效果:可自定義各種動畫效果 
    不再侷限於4種基本變換:平移、旋轉、縮放 & 透明度

3. 特點

  • 作用物件進行了擴充套件:不只是View物件,甚至沒物件也可以
  • 動畫效果:不只是4種基本變換,還有其他動畫效果
  • 作用領域:API11後引入的

4. 工作原理

  • 在一定時間間隔內,通過不斷對值進行改變,並不斷將該值賦給物件的屬性,從而實現該物件在該屬性上的動畫效果

    可以是任意物件的任意屬性

  • 具體的工作原理邏輯如下:

工作原理

  • 從上述工作原理可以看出屬性動畫有兩個非常重要的類:ValueAnimator 類 & ObjectAnimator 類
  • 其實屬性動畫的使用基本都是依靠這兩個類
  • 所以,在下面介紹屬性動畫的具體使用時,我會著重介紹這兩個類。

5. 具體使用

5.1 ValueAnimator類

  • 定義:屬性動畫機制中 最核心的一個類
  • 實現動畫的原理:通過不斷控制 值 的變化,再不斷 手動 賦給物件的屬性,從而實現動畫效果。如圖下:

工作原理

從上面原理可以看出:ValueAnimator類中有3個重要方法: 
1. ValueAnimator.ofInt(int values) 
2. ValueAnimator.ofFloat(float values) 
3. ValueAnimator.ofObject(int values)

下面我將逐一介紹。

5.1.1 ValueAnimator.ofInt(int values)

  • 作用:將初始值 以整型數值的形式 過渡到結束值 

    即估值器是整型估值器 - IntEvaluator

  • 工作原理:

工作原理
  • 具體使用: 

    特別說明: 
    1. 因為ValueAnimator本質只是一種值的操作機制,所以下面的介紹先是展示如何改變一個值的過程(下面的例項主要講解:如何將一個值從0平滑地過渡到3) 
    2. 至於如何實現動畫,是需要開發者手動將這些 值 賦給 物件的屬性值。關於這部分在下節會進行說明。


操作值的方式 分為 XML 設定 / Java 程式碼設定 
設定方式1:Java程式碼設定
實際開發中,建議使用Java程式碼實現屬性動畫:因為很多時候屬性的起始值是無法提前確定的(無法使用XML設定),這就需要在Java程式碼裡動態獲取。
// 步驟1:設定動畫屬性的初始值 & 結束值
ValueAnimator anim = ValueAnimator.ofInt(0, 3);
        // ofInt()作用有兩個
        // 1. 建立動畫例項
        // 2. 將傳入的多個Int引數進行平滑過渡:此處傳入0和1,表示將值從0平滑過渡到1
        // 如果傳入了3個Int引數 a,b,c ,則是先從a平滑過渡到b,再從b平滑過渡到C,以此類推
        // ValueAnimator.ofInt()內建了整型估值器,直接採用預設的.不需要設定,即預設設定瞭如何從初始值 過渡到 結束值
        // 關於自定義插值器我將在下節進行講解
        // 下面看看ofInt()的原始碼分析 ->>關注1

// 步驟2:設定動畫的播放各種屬性
        anim.setDuration(500);
        // 設定動畫執行的時長

        anim.setStartDelay(500);
        // 設定動畫延遲播放時間

        anim.setRepeatCount(0);
        // 設定動畫重複播放次數 = 重放次數+1
        // 動畫播放次數 = infinite時,動畫無限重複

        anim.setRepeatMode(ValueAnimator.RESTART);
        // 設定重複播放動畫模式
        // ValueAnimator.RESTART(預設):正序重放
        // ValueAnimator.REVERSE:倒序回放

// 步驟3:將改變的值手動賦值給物件的屬性值:通過動畫的更新監聽器
        // 設定 值的更新監聽器
        // 即:值每次改變、變化一次,該方法就會被呼叫一次
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {

                int currentValue = (Integer) animation.getAnimatedValue();
                // 獲得改變後的值

                System.out.println(currentValue);
                // 輸出改變後的值

        // 步驟4:將改變後的值賦給物件的屬性值,下面會詳細說明
                View.setproperty(currentValue);

       // 步驟5:重新整理檢視,即重新繪製,從而實現動畫效果
                View.requestLayout();


            }
        });

        anim.start();
        // 啟動動畫
    }

// 關注1:ofInt()原始碼分析
    public static ValueAnimator ofInt(int... values) {
        // 允許傳入一個或多個Int引數
        // 1. 輸入一個的情況(如a):從0過渡到a;
        // 2. 輸入多個的情況(如a,b,c):先從a平滑過渡到b,再從b平滑過渡到C

        ValueAnimator anim = new ValueAnimator();
        // 建立動畫物件
        anim.setIntValues(values);
        // 將傳入的值賦值給動畫物件
        return anim;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

效果圖

值 從初始值 過度到 結束值 的過程如下:

效果圖

設定方法2:在XML 程式碼中設定 
具備重用性,即將通用的動畫寫到XML裡,可在各個介面中去重用它

  • 步驟1:在路徑 res/animator的資料夾裡建立相應的動畫 .xml檔案

    此處設定為res/animator/set_animation.xml

  • 步驟2:設定動畫引數

set_animation.xml

// ValueAnimator採用<animator>  標籤
<animator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:valueFrom="0"   // 初始值
    android:valueTo="100"  // 結束值
    android:valueType="intType" // 變化值型別 :floatType & intType

    android:duration="3000" // 動畫持續時間(ms),必須設定,動畫才有效果
    android:startOffset ="1000" // 動畫延遲開始時間(ms)
    android:fillBefore = “true// 動畫播放完後,檢視是否會停留在動畫開始的狀態,預設為true
    android:fillAfter = “false// 動畫播放完後,檢視是否會停留在動畫結束的狀態,優先於fillBefore值,預設為false
    android:fillEnabled= “true// 是否應用fillBefore值,對fillAfter值無影響,預設為true
    android:repeatMode= “restart” // 選擇重複播放動畫模式,restart代表正序重放,reverse代表倒序回放,預設為restart|
    android:repeatCount = “0// 重放次數(所以動畫的播放次數=重放次數+1),為infinite時無限重複
    android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影響動畫的播放速度,下面會詳細講

/>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 步驟3:在Java程式碼中啟動動畫
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation);  
// 載入XML動畫

animator.setTarget(view);  
// 設定動畫物件

animator.start();  
// 啟動動畫
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

效果圖

效果同第一種方式是一樣的。

例項說明

  • 下面,我將結合 手動賦值給物件屬性 這一步驟,從而實現一個完整的動畫效果
  • 實現的動畫效果:按鈕的寬度從 150px 放大到 500px
Button mButton = (Button) findViewById(R.id.Button);
        // 建立動畫作用物件:此處以Button為例

// 步驟1:設定屬性數值的初始值 & 結束值
        ValueAnimator valueAnimator = ValueAnimator.ofInt(mButton.getLayoutParams().width, 500);
        // 初始值 = 當前按鈕的寬度,此處在xml檔案中設定為150
        // 結束值 = 500
        // ValueAnimator.ofInt()內建了整型估值器,直接採用預設的.不需要設定
        // 即預設設定瞭如何從初始值150 過渡到 結束值500

// 步驟2:設定動畫的播放各種屬性
        valueAnimator.setDuration(2000);
        // 設定動畫執行時長:1s

// 步驟3:將屬性數值手動賦值給物件的屬性:此處是將 值 賦給 按鈕的寬度
        // 設定更新監聽器:即數值每次變化更新都會呼叫該方法
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animator) {

                int currentValue = (Integer) animator.getAnimatedValue();
                // 獲得每次變化後的屬性值
                System.out.println(currentValue);
                // 輸出每次變化後的屬性值進行檢視

                mButton.getLayoutParams().width = currentValue;
                // 每次值變化時,將值手動賦值給物件的屬性
                // 即將每次變化後的值 賦 給按鈕的寬度,這樣就實現了按鈕寬度屬性的動態變化

// 步驟4:重新整理檢視,即重新繪製,從而實現動畫效果
                mButton.requestLayout();

            }
        });

        valueAnimator.start();
        // 啟動動畫

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

效果圖

效果圖

5.1.2 ValueAnimator.oFloat(float values)

  • 作用:將初始值 以浮點型數值的形式 過渡到結束值

  • 工作原理:

工作原理

  • 具體使用:分為 XML 設定 / Java 程式碼設定

設定方法1:在 Java 程式碼中設定

ValueAnimator anim = ValueAnimator.ofFloat(0, 3);  
// 其他使用類似ValueAnimator.ofInt(int values),此處不作過多描述
  • 1
  • 2

設定方法2:在XML 程式碼中設定

  • 步驟1:在路徑 res/animator的資料夾裡建立相應的動畫.xml檔案

    此處設定為res/animator/set_animation.xml

  • 步驟2:設定動畫引數

set_animation.xml

// ValueAnimator採用<animator>  標籤
<animator xmlns:android="http://schemas.android.com/apk/res/android"  
    // 設定屬性同上
    android:valueFrom="0"  
    android:valueTo="100"  
    android:valueType="intType"/>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 步驟3:在Java程式碼中啟動動畫
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation);  
// 載入XML動畫

animator.setTarget(view);  
// 設定動畫物件

animator
            
           

相關推薦

Android 屬性動畫屬性動畫 總結&

轉載:http://blog.csdn.net/carson_ho/article/details/72909894 更多內容請參考: 1. 屬性動畫1:基礎知識和ValueAnimator:http://blog.csdn.net/wangxiaocheng16

面試帶你飛這是一份全面的 計算機網路基礎 總結

前言 計算機網路基礎 該是程式猿需掌握的知識,也是面試過程中常常考察的內容,但往往會被忽略 今天,我將獻上一份詳細 & 清晰的計算機網路基礎 學習指南,涵蓋 TCP / UDP協議、Http協議、Socket等,希望你們會喜歡。 目錄   1. 計算

android屏幕適配的全

屏幕分辨率 縮放 img 關系 我們 http 分辨 tro pix 一. 核心概念與單位詳解 1. 什麽是屏幕尺寸、屏幕分辨率、屏幕像素密度? 屏幕分辨率越大,手機越清晰 2. 什麽是dp、dip、dpi、sp、px?之間的關系是什麽? dip:Density

Android Retrofit 2.0 的詳細 使用(含例項講解)

前言 在Andrroid開發中,網路請求十分常用 而在Android網路請求庫中,Retrofit是當下最熱的一個網路請求庫 Github截圖 今天,我將獻上一份非常詳細Retrofit v2.0的使用教程,希望你們會喜歡。 目錄 目錄 1. 簡介

Android Studio依賴包aar使用全

如有不妥的地方歡迎Gradle大神批評指正。 今天包含以下幾點: - aar 檔案簡介 - 生成方法 - 向工程中新增依賴的方法(即讓Android Studio認出aar的方法) - 呼叫方法 aar 檔案簡介 首先,講講aar: 相信

Android權威官方螢幕適配全

Android的螢幕適配一直以來都在折磨著我們這些開發者,本篇文章以Google的官方文件為基礎,全面而深入的講解了Android螢幕適配的原因、重要概念、解決方案及最佳實踐,我相信如果你能認真的學習本文,對於Android的螢幕適配,你將有所收穫!

Android中使用SyncAdapter同步資料全

參考資料: SyncAdapter是什麼? SyncManager是Android提供的一個同步框架,該框架實施了許多最佳做法,它允許Android應用使用Google應用中實現高效同步的一個基本框架。 它實際上是一個數據集中點,將所有的資料傳輸都放到同一個地方,以便作業系統智慧地安排資料傳輸,優化電池效

實戰經驗網咖入侵全(1)

        好久都沒來網咖了,今天一朋友來找我。外面有下著雪,實在沒地方玩,又給溜進了網咖……  在以前家裡沒買電腦時。整天都泡這網咖,所以對他的系統設定什麼還了解點,都大半年沒來了……不知道有啥變化……  這網咖還不錯.別的網咖都是無盤的或者就是98的.這裡98和200

在githu上面開源自己的android library,讓專案依賴使用

使用過Android studio的朋友都知道怎麼使用gradle去依賴別人寫的開源庫。比如compile 'com.android.support:appcompat-v7:25.3.0' 。在gi

Android筆記之螢幕適配全

Android螢幕適配出現的原因 在我們學習如何進行螢幕適配之前,我們需要先了解下為什麼Android需要進行螢幕適配。 由於Android系統的開放性,任何使用者、開發者、OEM廠商、運營商都可以對Android進行定製,修改成他們想要的樣子。

Android平臺的 Ptrace, 注入, Hook 全

Android平臺上的Ptrace已經流行很久了,我記得最早的時候是LBE開始使用Ptrace在Android上做攔截,大概三年前我原來的同事yuki (看雪上的古河) 寫了一個利用Ptrace注入的例子,被廣泛使用,聽說他還因此當上了版主,呵呵:Android平臺上的注

HenCoder Android 自定義 View 1-7屬性動畫 Property Animation(進階篇)

這期是 HenCoder 自定義繪製的第 1-7 期:屬性動畫(進階篇) 簡介 上期的內容,對於大多數簡單的屬性動畫場景已經夠用了。這期的內容主要針對兩個方面: 針對特殊型別的屬性來做屬性動畫; 針對複雜的屬性關係來做屬性動畫。 TypeEvaluator

Android 屬性動畫實現小球墜落

一、要做什麼 專案需要實現的效果:小球墜落 1. 首先繪製小球--自定義View 繪製圓; 2. 模擬小球墜落--屬性動畫,重繪小球軌跡; 3. 修改小球顏色--實現自定義TypeEvaluator; 實現的簡單效果如下: 二、思考

Android 動畫詳解屬性動畫、View 動畫和幀動畫

開發十年,就只剩下這套架構體系了! >>>   

android 動畫xml屬性具體解釋

rotate oat 向上 四種 art 無線循環 java代碼 erp toys /** * 作者:crazyandcoder * 聯系: * QQ : 275137657 * email:

Android圖文具體解釋屬性動畫

ref processor 拷貝 number name rup prop ren del Android中的動畫分為視圖動畫(View Animation)、屬性動畫(Property Animation)以及Drawable動畫。從Android 3

Android - 動畫(幀動畫,補間動畫屬性動畫,以及插值器)

一: 動畫的分類 幀動畫 補間動畫 屬性動畫 二:解析 1. 幀動畫 (1)定義 這些圖片是將一些列的drawable組合在一起,進行連續的播放, 類似於以前電影源用膠捲進行動畫播放 (2)有圖有真相 (3)準備圖片 看著是不是還行,哈哈,

Android動畫屬性動畫基礎用法

在上一篇Android動畫基礎之補間動畫與逐幀動畫 ,我們複習了Android的基礎動畫Tweened Animation、Frame Animation,同時指出他們的缺陷,改變是View的顯示效果而不是View本身的屬性,還有我們不多不少會看多人家的APP有一些很酷炫的動畫效果,但是

屬性動畫ValueAnimator類和ObjectAnimator類的簡單使用

ValueAnimator類:  ValueAnimator anim = ValueAnimator.ofInt(0, 3); // ofInt()作用有兩個 // 1. 建立動畫例項 // 2. 將傳入的多個Int引數進行

CSS3變形和動畫旋轉、扭曲、縮放、位移、矩陣 、原點 transform-origin、過渡屬性 transition-property、過渡所需時間 transition-duration...

旋轉、扭曲、縮放、位移、矩陣 、原點 transform-origin、過渡屬性 transition-property、過渡所需時間 transition-duration、過渡函式 transition-timing-function、過渡延遲時間 transition-