Carson帶你學Android:這些屬性動畫的使用小技巧你了解嗎


前言

  • 屬性動畫的使用 是 Android 開發中常用的知識
  • 今天,我將講解屬性動畫使用中的一些使用小技巧,希望你們會喜歡。

Carson帶你學Android動畫系列文章:
Carson帶你學Android:一份全面&詳細的動畫知識學習攻略
Carson帶你學Android:常見的三種動畫類型
Carson帶你學Android:補間動畫學習教程
Carson帶你學Android:屬性動畫學習教程
Carson帶你學Android:逐幀動畫學習教程
Carson帶你學Android:自定義動畫神器-估值器(含實例教學)
Carson帶你學Android:自定義動畫神器-插值器(含實例教學)


目錄

示意圖

儲備知識

屬性動畫簡介:Android 屬性動畫:這是一篇全面 & 詳細的 屬性動畫 總結&攻略


1. 組合動畫

1.1 簡介

單一動畫實現的效果相當有限,更多的使用場景是同時使用多種動畫效果,即組合動畫

1.2 具體使用

實現 組合動畫 的功能:AnimatorSet

AnimatorSet.play(Animator anim)   :播放當前動畫
AnimatorSet.after(long delay)   :將現有動畫延遲x毫秒后執行
AnimatorSet.with(Animator anim)   :將現有動畫和傳入的動畫同時執行
AnimatorSet.after(Animator anim)   :將現有動畫插入到傳入的動畫之后執行
AnimatorSet.before(Animator anim) :  將現有動畫插入到傳入的動畫之前執行

1.3 實例講解

主要動畫是平移,平移過程中伴隨旋轉動畫,平移完后進行透明度變化

實現方式有 XML設置 / Java代碼設置

設置方式1: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();  

效果圖

組合動畫.gif

設置方式2:XML設置

  • 步驟1:在 res/animator的文件夾里創建動畫.xml文件

此處為 res/animator/set_animation.xml

  • 步驟2:設置動畫效果

set_animation.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>

在Java代碼中啟動動畫

mButton = (Button) findViewById(R.id.Button);
        // 創建動畫作用對象:此處以Button為例

        AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animation);
// 創建組合動畫對象  &  加載XML動畫
        animator.setTarget(mButton);
        // 設置動畫作用對象
        animator.start();
        // 啟動動畫

2. 快捷使用

2.1 簡介

  • 從屬性動畫的原理可知,屬性動畫的本質是:對值進行操作
  • Java是面向對象的,所以 Google 團隊添加面向對象操作的屬性動畫使用 - ViewPropertyAnimator

可認為是屬性動畫的一種簡寫、快捷使用方式

2.2 具體使用

View.animate().xxx().xxx();
// ViewPropertyAnimator的功能建立在animate()上
// 調用animate()方法返回值是一個ViewPropertyAnimator對象,之后的調用的所有方法都是通過該實例完成
// 調用該實例的各種方法來實現動畫效果
// ViewPropertyAnimator所有接口方法都使用連綴語法來設計,每個方法的返回值都是它自身的實例
// 因此調用完一個方法后可直接連綴調用另一方法,即可通過一行代碼就完成所有動畫效果

2.3 實例講解

mButton = (Button) findViewById(R.id.Button);
// 創建動畫作用對象:此處以Button為例

mButton.animate().alpha(0f);
// 單個動畫設置:將按鈕變成透明狀態 
mButton.animate().alpha(0f).setDuration(5000).setInterpolator(new BounceInterpolator());
// 單個動畫效果設置 & 參數設置 
mButton.animate().alpha(0f).x(500).y(500);
// 組合動畫:將按鈕變成透明狀態再移動到(500,500)處

// 特別注意:
// 動畫自動啟動,無需調用start()方法.因為新的接口中使用了隱式啟動動畫的功能,只要我們將動畫定義完成后,動畫就會自動啟動
// 該機制對于組合動畫也同樣有效,只要不斷地連綴新的方法,那么動畫就不會立刻執行,等到所有在ViewPropertyAnimator上設置的方法都執行完畢后,動畫就會自動啟動
// 如果不想使用這一默認機制,也可以顯式地調用start()方法來啟動動畫

3. 監聽動畫

3.1 簡介

  • Animation類通過監聽動畫開始 / 結束 / 重復 / 取消時刻來進行一系列操作,如跳轉頁面等等

3.2 具體使用

  • 通過在Java代碼里addListener()設置
      Animation.addListener(new AnimatorListener() {
          @Override
          public void onAnimationStart(Animation animation) {
              //動畫開始時執行
          }
      
           @Override
          public void onAnimationRepeat(Animation animation) {
              //動畫重復時執行
          }

         @Override
          public void onAnimationCancel()(Animation animation) {
              //動畫取消時執行
          }
    
          @Override
          public void onAnimationEnd(Animation animation) {
              //動畫結束時執行
          }
      });

// 特別注意:每次監聽必須4個方法都重寫。

3.3 特別注意

  • Animator類、AnimatorSet類、ValueAnimatorObjectAnimator類存在以下繼承關系
各類繼承關系
  • 所以AnimatorSet類、ValueAnimatorObjectAnimator都可以使用addListener()監聽器進行動畫監聽

4. 動畫適配器

4.1 背景

有些時候我們并不需要監聽動畫的所有時刻

4.2 問題

addListener(new AnimatorListener())監聽器是必須重寫4個時刻方法,這使得接口方法重寫太累贅

4.3 解決方案

采用動畫適配器(AnimatorListenerAdapter),解決實現接口繁瑣 的問題

anim.addListener(new AnimatorListenerAdapter() {  
// 向addListener()方法中傳入適配器對象AnimatorListenerAdapter()
// 由于AnimatorListenerAdapter中已經實現好每個接口
// 所以這里不實現全部方法也不會報錯
    @Override  
    public void onAnimationStart(Animator animation) {  
    // 如想只想監聽動畫開始時刻,就只需要單獨重寫該方法就可以
    }  
});  

至此,關于Android 動畫中屬性動畫的使用小技巧講解完畢。


5. 總結


歡迎關注Carson_Ho的簡書

不定期分享關于安卓開發的干貨,追求短、平、快,但卻不缺深度


請點贊!因為你的鼓勵是我寫作的最大動力!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容