前言
- 屬性動畫的使用 是
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
類、ValueAnimator
、ObjectAnimator
類存在以下繼承關系
各類繼承關系
- 所以
AnimatorSet
類、ValueAnimator
、ObjectAnimator
都可以使用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. 總結
- 本文對
Android
屬性動畫中的使用小技巧進行了全面 & 詳細介紹 - Carson帶你學
Android
動畫系列文章:
Carson帶你學Android:一份全面&詳細的動畫知識學習攻略
Carson帶你學Android:常見的三種動畫類型
Carson帶你學Android:補間動畫學習教程
Carson帶你學Android:屬性動畫學習教程
Carson帶你學Android:逐幀動畫學習教程
Carson帶你學Android:自定義動畫神器-估值器(含實例教學)
Carson帶你學Android:自定義動畫神器-插值器(含實例教學)
歡迎關注Carson_Ho的簡書
不定期分享關于安卓開發的干貨,追求短、平、快,但卻不缺深度。