前言
- 屬性動(dòng)畫的使用 是
Android
開發(fā)中常用的知識(shí) - 今天叶沛,我將講解屬性動(dòng)畫使用中的一些使用小技巧莹痢,希望你們會(huì)喜歡并炮。
Carson帶你學(xué)
Android
動(dòng)畫系列文章:
Carson帶你學(xué)Android:一份全面&詳細(xì)的動(dòng)畫知識(shí)學(xué)習(xí)攻略
Carson帶你學(xué)Android:常見的三種動(dòng)畫類型
Carson帶你學(xué)Android:補(bǔ)間動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:屬性動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:逐幀動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:自定義動(dòng)畫神器-估值器(含實(shí)例教學(xué))
Carson帶你學(xué)Android:自定義動(dòng)畫神器-插值器(含實(shí)例教學(xué))
目錄
儲(chǔ)備知識(shí)
屬性動(dòng)畫簡(jiǎn)介:Android 屬性動(dòng)畫:這是一篇全面 & 詳細(xì)的 屬性動(dòng)畫 總結(jié)&攻略
1. 組合動(dòng)畫
1.1 簡(jiǎn)介
單一動(dòng)畫實(shí)現(xiàn)的效果相當(dāng)有限,更多的使用場(chǎng)景是同時(shí)使用多種動(dòng)畫效果引几,即組合動(dòng)畫
1.2 具體使用
實(shí)現(xiàn) 組合動(dòng)畫 的功能:AnimatorSet
類
AnimatorSet.play(Animator anim) :播放當(dāng)前動(dòng)畫
AnimatorSet.after(long delay) :將現(xiàn)有動(dòng)畫延遲x毫秒后執(zhí)行
AnimatorSet.with(Animator anim) :將現(xiàn)有動(dòng)畫和傳入的動(dòng)畫同時(shí)執(zhí)行
AnimatorSet.after(Animator anim) :將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之后執(zhí)行
AnimatorSet.before(Animator anim) : 將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之前執(zhí)行
1.3 實(shí)例講解
主要?jiǎng)赢嬍瞧揭疲揭七^(guò)程中伴隨旋轉(zhuǎn)動(dòng)畫赚哗,平移完后進(jìn)行透明度變化
實(shí)現(xiàn)方式有
XML
設(shè)置 /Java
代碼設(shè)置
設(shè)置方式1:Java
代碼設(shè)置
// 步驟1:設(shè)置需要組合的動(dòng)畫效果
ObjectAnimator translation = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX);
// 平移動(dòng)畫
ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f);
// 旋轉(zhuǎn)動(dòng)畫
ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f);
// 透明度動(dòng)畫
// 步驟2:創(chuàng)建組合動(dòng)畫的對(duì)象
AnimatorSet animSet = new AnimatorSet();
// 步驟3:根據(jù)需求組合動(dòng)畫
animSet.play(translation).with(rotate).before(alpha);
animSet.setDuration(5000);
// 步驟4:?jiǎn)?dòng)動(dòng)畫
animSet.start();
效果圖
設(shè)置方式2:XML
設(shè)置
- 步驟1:在
res/animator
的文件夾里創(chuàng)建動(dòng)畫.xml
文件
此處為
res/animator/set_animation.xml
- 步驟2:設(shè)置動(dòng)畫效果
set_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
// 表示Set集合內(nèi)的動(dòng)畫按順序進(jìn)行
// ordering的屬性值:sequentially & together
// sequentially:表示set中的動(dòng)畫她紫,按照先后順序逐步進(jìn)行(a 完成之后進(jìn)行 b )
// together:表示set中的動(dòng)畫,在同一時(shí)間同時(shí)進(jìn)行,為默認(rèn)值
<set android:ordering="together" >
// 下面的動(dòng)畫同時(shí)進(jìn)行
<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" >
// 下面的動(dòng)畫按序進(jìn)行
<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代碼中啟動(dòng)動(dòng)畫
mButton = (Button) findViewById(R.id.Button);
// 創(chuàng)建動(dòng)畫作用對(duì)象:此處以Button為例
AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_animation);
// 創(chuàng)建組合動(dòng)畫對(duì)象 & 加載XML動(dòng)畫
animator.setTarget(mButton);
// 設(shè)置動(dòng)畫作用對(duì)象
animator.start();
// 啟動(dòng)動(dòng)畫
2. 快捷使用
2.1 簡(jiǎn)介
- 從屬性動(dòng)畫的原理可知屿储,屬性動(dòng)畫的本質(zhì)是:對(duì)值進(jìn)行操作
- 但
Java
是面向?qū)ο蟮模?Google
團(tuán)隊(duì)添加面向?qū)ο蟛僮鞯膶傩詣?dòng)畫使用 -ViewPropertyAnimator
類
可認(rèn)為是屬性動(dòng)畫的一種簡(jiǎn)寫渐逃、快捷使用方式
2.2 具體使用
View.animate().xxx().xxx();
// ViewPropertyAnimator的功能建立在animate()上
// 調(diào)用animate()方法返回值是一個(gè)ViewPropertyAnimator對(duì)象,之后的調(diào)用的所有方法都是通過(guò)該實(shí)例完成
// 調(diào)用該實(shí)例的各種方法來(lái)實(shí)現(xiàn)動(dòng)畫效果
// ViewPropertyAnimator所有接口方法都使用連綴語(yǔ)法來(lái)設(shè)計(jì)够掠,每個(gè)方法的返回值都是它自身的實(shí)例
// 因此調(diào)用完一個(gè)方法后可直接連綴調(diào)用另一方法,即可通過(guò)一行代碼就完成所有動(dòng)畫效果
2.3 實(shí)例講解
mButton = (Button) findViewById(R.id.Button);
// 創(chuàng)建動(dòng)畫作用對(duì)象:此處以Button為例
mButton.animate().alpha(0f);
// 單個(gè)動(dòng)畫設(shè)置:將按鈕變成透明狀態(tài)
mButton.animate().alpha(0f).setDuration(5000).setInterpolator(new BounceInterpolator());
// 單個(gè)動(dòng)畫效果設(shè)置 & 參數(shù)設(shè)置
mButton.animate().alpha(0f).x(500).y(500);
// 組合動(dòng)畫:將按鈕變成透明狀態(tài)再移動(dòng)到(500,500)處
// 特別注意:
// 動(dòng)畫自動(dòng)啟動(dòng),無(wú)需調(diào)用start()方法.因?yàn)樾碌慕涌谥惺褂昧穗[式啟動(dòng)動(dòng)畫的功能,只要我們將動(dòng)畫定義完成后茄菊,動(dòng)畫就會(huì)自動(dòng)啟動(dòng)
// 該機(jī)制對(duì)于組合動(dòng)畫也同樣有效疯潭,只要不斷地連綴新的方法赊堪,那么動(dòng)畫就不會(huì)立刻執(zhí)行,等到所有在ViewPropertyAnimator上設(shè)置的方法都執(zhí)行完畢后竖哩,動(dòng)畫就會(huì)自動(dòng)啟動(dòng)
// 如果不想使用這一默認(rèn)機(jī)制哭廉,也可以顯式地調(diào)用start()方法來(lái)啟動(dòng)動(dòng)畫
3. 監(jiān)聽動(dòng)畫
3.1 簡(jiǎn)介
-
Animation
類通過(guò)監(jiān)聽動(dòng)畫開始 / 結(jié)束 / 重復(fù) / 取消時(shí)刻來(lái)進(jìn)行一系列操作,如跳轉(zhuǎn)頁(yè)面等等
3.2 具體使用
- 通過(guò)在
Java
代碼里addListener()
設(shè)置
Animation.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animation animation) {
//動(dòng)畫開始時(shí)執(zhí)行
}
@Override
public void onAnimationRepeat(Animation animation) {
//動(dòng)畫重復(fù)時(shí)執(zhí)行
}
@Override
public void onAnimationCancel()(Animation animation) {
//動(dòng)畫取消時(shí)執(zhí)行
}
@Override
public void onAnimationEnd(Animation animation) {
//動(dòng)畫結(jié)束時(shí)執(zhí)行
}
});
// 特別注意:每次監(jiān)聽必須4個(gè)方法都重寫相叁。
3.3 特別注意
- 因
Animator
類遵绰、AnimatorSet
類、ValueAnimator
增淹、ObjectAnimator
類存在以下繼承關(guān)系
- 所以
AnimatorSet
類椿访、ValueAnimator
、ObjectAnimator
都可以使用addListener()
監(jiān)聽器進(jìn)行動(dòng)畫監(jiān)聽
4. 動(dòng)畫適配器
4.1 背景
有些時(shí)候我們并不需要監(jiān)聽動(dòng)畫的所有時(shí)刻
4.2 問(wèn)題
但addListener(new AnimatorListener())
監(jiān)聽器是必須重寫4個(gè)時(shí)刻方法虑润,這使得接口方法重寫太累贅
4.3 解決方案
采用動(dòng)畫適配器(AnimatorListenerAdapter
)成玫,解決實(shí)現(xiàn)接口繁瑣 的問(wèn)題
anim.addListener(new AnimatorListenerAdapter() {
// 向addListener()方法中傳入適配器對(duì)象AnimatorListenerAdapter()
// 由于AnimatorListenerAdapter中已經(jīng)實(shí)現(xiàn)好每個(gè)接口
// 所以這里不實(shí)現(xiàn)全部方法也不會(huì)報(bào)錯(cuò)
@Override
public void onAnimationStart(Animator animation) {
// 如想只想監(jiān)聽動(dòng)畫開始時(shí)刻,就只需要單獨(dú)重寫該方法就可以
}
});
至此拳喻,關(guān)于Android
動(dòng)畫中屬性動(dòng)畫
的使用小技巧講解完畢哭当。
5. 總結(jié)
- 本文對(duì)
Android
屬性動(dòng)畫中的使用小技巧進(jìn)行了全面 & 詳細(xì)介紹 - Carson帶你學(xué)
Android
動(dòng)畫系列文章:
Carson帶你學(xué)Android:一份全面&詳細(xì)的動(dòng)畫知識(shí)學(xué)習(xí)攻略
Carson帶你學(xué)Android:常見的三種動(dòng)畫類型
Carson帶你學(xué)Android:補(bǔ)間動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:屬性動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:逐幀動(dòng)畫學(xué)習(xí)教程
Carson帶你學(xué)Android:自定義動(dòng)畫神器-估值器(含實(shí)例教學(xué))
Carson帶你學(xué)Android:自定義動(dòng)畫神器-插值器(含實(shí)例教學(xué))
歡迎關(guān)注Carson_Ho的簡(jiǎn)書
不定期分享關(guān)于安卓開發(fā)的干貨,追求短冗澈、平钦勘、快,但卻不缺深度渗柿。