Android框架提供了兩個(gè)動(dòng)畫系統(tǒng),屬性動(dòng)畫(property animation )和視圖動(dòng)畫(view animation)。在一般情況下我們大多使用屬性動(dòng)畫,因?yàn)樗`活,并提供更多的功能。另外,還有一種幀動(dòng)畫,它通過加載圖片資源,將多張圖片一幀一幀顯示形成動(dòng)畫效果。
1.視圖動(dòng)畫(View Animation)
視圖動(dòng)畫在很早的Android系統(tǒng)中就已提供,它只能用來設(shè)置View的動(dòng)畫。視圖動(dòng)畫也叫補(bǔ)間動(dòng)畫,通過xml文件或java代碼定義。
1-1.屬性詳解
在補(bǔ)間動(dòng)畫中主要可以實(shí)現(xiàn)視圖的位移(translate)、縮放(scale)、旋轉(zhuǎn)(rotate)、淡入淡出(alpha)四種效果。其各的主要屬性如下:
Animation屬性詳解
| xml屬性 | java方法 | 解釋 |
|---|---|---|
| android:detachWallpaper | setDetachWallpaper(boolean) | 是否在壁紙上運(yùn)行 |
| android:duration | setDuration(long) | 動(dòng)畫持續(xù)時(shí)間,毫秒為單位 |
| android:fillAfter | setFillAfter(boolean) | 控件動(dòng)畫結(jié)束時(shí)是否保持動(dòng)畫最后的狀態(tài) |
| android:fillBefore | setFillBefore(boolean) | 控件動(dòng)畫結(jié)束時(shí)是否還原到開始動(dòng)畫前的狀態(tài) |
| android:fillEnabled | setFillEnabled(boolean) | 與android:fillBefore效果相同 |
| android:interpolator | setInterpolator(Interpolator) | 設(shè)定插值器(指定的動(dòng)畫效果,譬如回彈等) |
| android:repeatCount | setRepeatCount(int) | 重復(fù)次數(shù) |
| android:repeatMode | setRepeatMode(int) | 重復(fù)類型有兩個(gè)值,reverse表示倒序回放,restart表示從頭播放 |
| android:startOffset | setStartOffset(long) | 調(diào)用start函數(shù)之后等待開始運(yùn)行的時(shí)間,單位為毫秒 |
| android:zAdjustment | setZAdjustment(int) | 表示被設(shè)置動(dòng)畫的內(nèi)容運(yùn)行時(shí)在Z軸上的位置(top/bottom/normal),默認(rèn)為normal |
Alpha屬性詳解
| xml屬性 | java方法 | 解釋 |
|---|---|---|
| android:fromAlpha | AlphaAnimation(float fromAlpha, …) | 動(dòng)畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) |
| android:toAlpha | AlphaAnimation(…, float toAlpha) | 動(dòng)畫結(jié)束的透明度,同上 |
Rotate屬性詳解
| xml屬性 | java方法 | 解釋 |
|---|---|---|
| android:fromDegrees | RotateAnimation(float fromDegrees, …) | 旋轉(zhuǎn)開始角度,正代表順時(shí)針度數(shù),負(fù)代表逆時(shí)針度數(shù) |
| android:toDegrees | RotateAnimation(…, float toDegrees, …) | 旋轉(zhuǎn)結(jié)束角度,正代表順時(shí)針度數(shù),負(fù)代表逆時(shí)針度數(shù) |
| android:pivotX | RotateAnimation(…, float pivotX, …) | 縮放起點(diǎn)X坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) |
| android:pivotY | RotateAnimation(…, float pivotY) | 縮放起點(diǎn)Y坐標(biāo),同上規(guī)律 |
Translate屬性詳解
| xml屬性 | java方法 | 解釋 |
|---|---|---|
| android:fromXDelta | TranslateAnimation(float fromXDelta, …) | 起始點(diǎn)X軸坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) |
| android:fromYDelta | TranslateAnimation(…, float fromYDelta, …) | 起始點(diǎn)Y軸從標(biāo),同上規(guī)律 |
| android:toXDelta | TranslateAnimation(…, float toXDelta, …) | 結(jié)束點(diǎn)X軸坐標(biāo),同上規(guī)律 |
| android:toYDelta | TranslateAnimation(…, float toYDelta) | 結(jié)束點(diǎn)Y軸坐標(biāo),同上規(guī)律 |
Scale屬性詳解
| xml屬性 | java方法 | 解釋 |
|---|---|---|
| android:fromXScale | ScaleAnimation(float fromX, …) | 初始X軸縮放比例,1.0表示無變化 |
| android:toXScale | ScaleAnimation(…, float toX, …) | 結(jié)束X軸縮放比例 |
| android:fromYScale | ScaleAnimation(…, float fromY, …) | 初始Y軸縮放比例 |
| android:toYScale | ScaleAnimation(…, float toY, …) | 結(jié)束Y軸縮放比例 |
| android:pivotX | ScaleAnimation(…, float pivotX, …) | 縮放起點(diǎn)X坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) |
| android:pivotY | ScaleAnimation(…, float pivotY) | 縮放起點(diǎn)Y坐標(biāo),同上規(guī)律 |
1-2.xml文件中定義
1.xml定義動(dòng)畫
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
</set>
2.在java中使用動(dòng)畫資源
Animation animation = AnimationUtils.loadAnimation(context,R.anim.view_anin);
image.startAnimation(animation);
1-3.java文件中定義
RotateAnimation rotateAnimation = new RotateAnimation(0,180);
rotateAnimation.setDuration(400);
image.startAnimation(rotateAnimation);
2.幀動(dòng)畫(Drawable Animation)
它通過加載圖片資源,將多張圖片一幀一幀顯示形成動(dòng)畫效果。在Android中提供了兩種方式為AnimationDrawable添加幀:XML定義的資源文件和Java代碼創(chuàng)建。
2-1.AnimationDrawable的常用方法:
-
void start():開始播放逐幀動(dòng)畫。 -
void stop():停止播放逐幀動(dòng)畫。 -
void addFrame(Drawable frame,int duration):為AnimationDrawable添加一幀,并設(shè)置持續(xù)時(shí)間。 -
int getDuration(int i):得到指定index的幀的持續(xù)時(shí)間。 -
Drawable getFrame(int index):得到指定index的幀Drawable。 -
int getNumberOfFrames():得到當(dāng)前AnimationDrawable的所有幀數(shù)量。 -
boolean isOneShot():當(dāng)前AnimationDrawable是否執(zhí)行一次,返回true執(zhí)行一次,false循環(huán)播放。 -
boolean isRunning():當(dāng)前AnimationDrawable是否正在播放。 -
void setOneShot(boolean oneShot):設(shè)置AnimationDrawable是否執(zhí)行一次,true執(zhí)行一次,false循環(huán)播放。
2-2.在xml文件中定義資源文件
1.xml文件中定義
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/loading_1" android:duration="100"/>
<item android:drawable="@drawable/loading_2" android:duration="100"/>
<item android:drawable="@drawable/loading_3" android:duration="100"/>
<item android:drawable="@drawable/loading_4" android:duration="100"/>
<item android:drawable="@drawable/loading_5" android:duration="100"/>
<item android:drawable="@drawable/loading_6" android:duration="100"/>
<item android:drawable="@drawable/loading_7" android:duration="100"/>
<item android:drawable="@drawable/loading_8" android:duration="100"/>
<item android:drawable="@drawable/loading_9" android:duration="100"/>
<item android:drawable="@drawable/loading_10" android:duration="100"/>
<item android:drawable="@drawable/loading_11" android:duration="100"/>
<item android:drawable="@drawable/loading_12" android:duration="100"/>
</animation-list>
2.在java中調(diào)用
// 通過逐幀動(dòng)畫的資源文件獲得AnimationDrawable示例
AnimationDrawable animationDrawable =(AnimationDrawable) getResources().getDrawable(R.drawable.animation_loading);
image.setImageDrawable(animationDrawable);
animationDrawable.start();
2-3.使用java定義資源文件
AnimationDrawable drawable = new AnimationDrawable();
drawable.addFrame(getResources().getDrawable(R.drawable.loading_1),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_2),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_3),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_4),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_5),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_6),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_7),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_8),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_9),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_10),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_11),100);
drawable.addFrame(getResources().getDrawable(R.drawable.loading_12),100);
drawable.setOneShot(true);
image.setImageDrawable(drawable);
drawable.start();
3.屬性動(dòng)畫(Property Animation)
屬性動(dòng)畫只對(duì)Android 3.0(API 11)以上版本的Android系統(tǒng)才有效,這種動(dòng)畫可以設(shè)置給任何Object,包括那些還沒有渲染到屏幕上的對(duì)象。這種動(dòng)畫是可擴(kuò)展的,可以讓你自定義任何類型和屬性的動(dòng)畫。
3-1.屬性動(dòng)畫允許我們定義以下的動(dòng)畫特點(diǎn):
- Duration:可以指定動(dòng)畫的持續(xù)時(shí)間。默認(rèn)長(zhǎng)度為300毫秒;
- Time interpolation:可以指定該屬性的值如何作為動(dòng)畫的當(dāng)前的運(yùn)行時(shí)間的函數(shù)來計(jì)算;
- Repeat count and behavior:指定動(dòng)畫的播放次數(shù),還可定義是否反向播放動(dòng)畫;
- Animator sets:動(dòng)畫集合,即可以同時(shí)對(duì)一個(gè)對(duì)象應(yīng)用多個(gè)動(dòng)畫,這些動(dòng)畫可以同時(shí)播放也可以對(duì)不同動(dòng)畫設(shè)置不同的延遲;
- Frame refresh dela:多少時(shí)間刷新一次動(dòng)畫,即每隔多少時(shí)間計(jì)算一次屬性值,默認(rèn)10ms。最終取決于系統(tǒng)整體多么繁忙,系統(tǒng)如何能夠快速的服務(wù)基礎(chǔ)計(jì)時(shí)器。
3-1.屬性動(dòng)畫的工作原理:
3-1-1.實(shí)例描述

如圖1所示的就是一個(gè)線性動(dòng)畫實(shí)例,描述了一個(gè)Object的x屬性隨時(shí)間勻速增長(zhǎng),也就是x方向的坐標(biāo)每10ms就移動(dòng)10個(gè)像素。

如圖2所示的是一個(gè)非線性動(dòng)畫實(shí)例,Object的x屬性同樣是沒10ms刷新一次,但在開始的時(shí)候,這個(gè)動(dòng)畫加速到中間點(diǎn),然后從中途減速,直至動(dòng)畫結(jié)束。
3-1-2.屬性動(dòng)畫主類之間的相互合作

ValueAnimator:是動(dòng)畫的執(zhí)行類,跟蹤動(dòng)畫的時(shí)間,并且它是動(dòng)畫的屬性的當(dāng)前值。
-
TimeInterpolator:ValueAnimator封裝了動(dòng)畫的TimeInterpolator時(shí)間插值器,定義動(dòng)畫的插入。 -
TypeEvaluator:用于設(shè)置動(dòng)畫屬性的值
要啟動(dòng)動(dòng)畫,需要?jiǎng)?chuàng)建一個(gè)ValueAnimator,并且指定目標(biāo)對(duì)象屬性的開始、結(jié)束值和持續(xù)時(shí)間。在調(diào)用start后,整個(gè)動(dòng)畫過程中, ValueAnimator會(huì)根據(jù)已經(jīng)完成的動(dòng)畫時(shí)間計(jì)算得到一個(gè)0到1之間的分?jǐn)?shù),代表該動(dòng)畫的已完成動(dòng)畫百分比。0表示0%,1表示100%。
當(dāng)ValueAnimator計(jì)算完已完成動(dòng)畫分?jǐn)?shù)后,它會(huì)調(diào)用當(dāng)前設(shè)置的TimeInterpolator,去計(jì)算得到一個(gè)interpolated(插值)分?jǐn)?shù),在計(jì)算過程中,已完成動(dòng)畫百分比會(huì)被加入到新的插值計(jì)算中。
當(dāng)插值分?jǐn)?shù)計(jì)算完成后,ValueAnimator會(huì)根據(jù)插值分?jǐn)?shù)調(diào)用合適的 TypeEvaluator去計(jì)算運(yùn)動(dòng)中的屬性值。
3-2.屬性動(dòng)畫的具體使用:
3-2-1.ValueAnimator
ValueAnimator是屬性動(dòng)畫的核心類,但平時(shí)用的時(shí)候好像不常接觸。使用的時(shí)候需要添加監(jiān)聽AnimatorUpdateListener監(jiān)聽,在監(jiān)聽方法中對(duì)需要執(zhí)行動(dòng)畫的對(duì)象設(shè)置當(dāng)前的屬性值。
ValueAnimator animation = ValueAnimator.ofFloat(0f, 100f);
animation.setDuration(1000);
animation.start();
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator updatedAnimation) {
// You can use the animated value in a property that uses the
// same type as the animation. In this case, you can use the
// float value in the translationX property.
float animatedValue = (float)updatedAnimation.getAnimatedValue();
textView.setTranslationX(animatedValue);
}
});
3-2-2.ObjectAnimator
ObjectAnimator是ValueAnimator的一個(gè)子類,相對(duì)于ValueAnimator,ObjectAnimator我們會(huì)用得更多一點(diǎn)。
使用:
ObjectAnimator.ofFloat(textview,"rotationX",0.0f,180f)
.setDuration(100)
.start();
對(duì)于ObjectAnimator..ofFloat(Object target,String propertyName,float... values),其中第一個(gè)參數(shù)代表需要作用到的View身上,第二個(gè)參數(shù)代表需要執(zhí)行的動(dòng)畫的屬性名,第三個(gè)可變參數(shù)代表屬性值。
需要注意參數(shù)名不要寫錯(cuò),不過可以寫一個(gè)該動(dòng)畫沒有的屬性,然后自己在AnimatorUpdateListener的onAnimationUpdate方法中設(shè)置多種屬性值,一次性實(shí)現(xiàn)淡入淡出、翻轉(zhuǎn)等多種效果,自己手動(dòng)調(diào)用,如:
ObjectAnimator anim = ObjectAnimator//
.ofFloat(view, "zhy", 1.0F, 0.0F)//
.setDuration(500);//
anim.start();
anim.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
float cVal = (Float) animation.getAnimatedValue();
view.setAlpha(cVal);
view.setScaleX(cVal);
view.setScaleY(cVal);
}
});
3-2-3.AnimatorSet組合動(dòng)畫
在很多情況下,我們不可能只對(duì)對(duì)象執(zhí)行一種動(dòng)畫,可能需要移動(dòng)的時(shí)候還要翻轉(zhuǎn),或者淡入淡出。Android系統(tǒng)就為我們提供了AnimatorSet這個(gè)類,并且會(huì)提供了以下四個(gè)方法幫助我們進(jìn)行動(dòng)畫的組合:
- after(Animator anim) 將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之后執(zhí)行
- after(long delay) 將現(xiàn)有動(dòng)畫延遲指定毫秒后執(zhí)行
- before(Animator anim) 將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之前執(zhí)行
- with(Animator anim) 將現(xiàn)有動(dòng)畫和傳入的動(dòng)畫同時(shí)執(zhí)行
使用
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
//三個(gè)動(dòng)畫同時(shí)執(zhí)行
//animSet.playTogether(moveIn,rotate,fadeInOut);
animSet.setDuration(5000);
animSet.start();
3-2-4.使用xml聲明動(dòng)畫
通過自定義的xml進(jìn)行聲明動(dòng)畫,可以進(jìn)行動(dòng)畫的重用,更輕松地編輯動(dòng)畫序列。
為了區(qū)分使用來自那些使用傳統(tǒng)的新屬性動(dòng)畫的API動(dòng)畫文件(視圖動(dòng)畫)框架,從Android 3.1開始,屬性動(dòng)畫的xml文件應(yīng)保存在res/animator/目錄下。
使用:
1.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together" >
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="0.5" >
</objectAnimator>
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="0.5" >
</objectAnimator>
</set>
2.java:中調(diào)用
// 加載動(dòng)畫
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scale);
mMv.setPivotX(0);
mMv.setPivotY(0);
//顯示的調(diào)用invalidate
mMv.invalidate();
anim.setTarget(mMv);
anim.start();
3-3.Animator監(jiān)聽器
Animator提供了一個(gè)addListener()的方法,這個(gè)方法接收一個(gè)AnimatorListener,我們只需要去實(shí)現(xiàn)這個(gè)AnimatorListener就可以監(jiān)聽動(dòng)畫的各種事件了。
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//動(dòng)畫啟動(dòng)時(shí)調(diào)用
}
@Override
public void onAnimationEnd(Animator animation) {
//當(dāng)動(dòng)畫結(jié)束時(shí)調(diào)用
}
@Override
public void onAnimationCancel(Animator animation) {
//當(dāng)動(dòng)畫被取消調(diào)用,被取消的動(dòng)畫還會(huì)調(diào)用onAnimationEnd方法
}
@Override
public void onAnimationRepeat(Animator animation) {
//當(dāng)動(dòng)畫重演調(diào)用
}
});
最后再了解一下插值器和估值器。
4.插值器(Interpolator)與估值器(TypeEvaluator)
插值器和估值器都是實(shí)現(xiàn)復(fù)雜動(dòng)畫的關(guān)鍵。其中插值器主要用來設(shè)置 屬性值 從初始值過渡到結(jié)束值 的變化規(guī)律 ,如加速,回彈等效果。估值器設(shè)置 屬性值 從初始值過渡到結(jié)束值 的變化具體數(shù)值 。插值器(Interpolator)決定 值 的變化規(guī)律(勻速、加速blabla),即決定的是變化趨勢(shì);而接下來的具體變化數(shù)值則交給
而估值器 。
插值器(Interpolator)
Android系統(tǒng)為我們提供了九種內(nèi)置的插值器,如下表:
| xml資源ID | java類 | 描述 |
|---|---|---|
| @android:anim/accelerate_interpolator | AccelerateInterpolator | 動(dòng)畫加速進(jìn)行 |
| @android:anim/overshoot_interpolator | OvershootInterpolator | 快速完成動(dòng)畫,超出再回到結(jié)束樣式 |
| @android:anim/accelerate_decelerate_interpolator | AccelerateDecelerateInterpolator | 先加速再減速 |
| @android:anim/anticipate_interpolator | AnticipateInterpolator | 先退后再加速前進(jìn) |
| @android:anim/anticipate_overshoot_interpolator | AnticipateOvershootInterpolator | 先退后再加速前進(jìn),超出終點(diǎn)后再回終點(diǎn) |
| @android:anim/bounce_interpolator | BounceInterpolator | 最后階段彈球效果 |
| @android:anim/cycle_interpolator | CycleInterpolator | 周期運(yùn)動(dòng) |
| @android:anim/decelerate_interpolator | DecelerateInterpolator | 減速 |
| @android:anim/linear_interpolator | LinearInterpolator | 勻速 |
插值器在動(dòng)畫的使用有xml和java兩種方式。
在xml中使用:
1.設(shè)置插值器 android:interpolator屬性
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400"
android:fillBefore="false" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="700"
android:duration="400" />
</set>
</set>
2.在java中調(diào)用
Animation animation = AnimationUtils.loadAnimation(context,R.anim.view_anin);
image.startAnimation(animation);
其實(shí)就是在上面的補(bǔ)間動(dòng)畫里加了個(gè)android:interpolator屬性就是。
在java中使用
TranslateAnimation rotateAnimation = new TranslateAnimation(0,200,0,200);
rotateAnimation.setDuration(400);
//創(chuàng)建對(duì)于的插值器
OvershootInterpolator interpolator = new OvershootInterpolator();
//設(shè)置插值器
rotateAnimation.setInterpolator(interpolator);
image.startAnimation(rotateAnimation);
自定義插值器
本質(zhì):根據(jù)動(dòng)畫的進(jìn)度(0%-100%)計(jì)算出當(dāng)前屬性值改變的百分比。
補(bǔ)間動(dòng)畫實(shí)現(xiàn)Interpolator接口。
屬性動(dòng)畫實(shí)現(xiàn)TimeInterpolator接口。
實(shí)現(xiàn)Interpolator接口
public class MyInterpolator implements Interpolator {
@Override
public float getInterpolation(float input) {
Log.d("print", "getInterpolation: " + input);
return input;
}
}
實(shí)現(xiàn)TimeInterpolator接口
public class MyInterpolator implements TimeInterpolator {
@Override
public float getInterpolation(float input) {
Log.d("print", "getInterpolation: " + input);
return input;
}
}
其中input為0~1.0之前的數(shù)字,表示當(dāng)前屬性變化的百分比。返回的值就是用于估值器繼續(xù)計(jì)算的fraction值,可以大于1。如:當(dāng)你return為0時(shí),動(dòng)畫將靜止在初始位置。當(dāng)你return為1時(shí),動(dòng)畫開始后將跳到你設(shè)置的終止位置停留知道動(dòng)畫時(shí)間停止后回到初始位置。
估值器(TypeEvaluator)
系統(tǒng)內(nèi)置了3個(gè)估值器,分別是:
- IntEvaluator:整數(shù)屬性值。
- FloatEvaluator:浮點(diǎn)型屬性值。
- ArgbEvaluator:十六進(jìn)制color屬性值。
使用:
ObjectAnimator objectAnimator = ObjectAnimator.ofObject(image,"alpha",new IntEvaluator(),1,0,1);
objectAnimator.setDuration(500);
objectAnimator.start();
自定義估值器:
需要實(shí)現(xiàn)TypeEvaluator接口:
public class MyTypeEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
// fraction:插值器getInterpolation()的返回值
// startValue:動(dòng)畫的初始值
// endValue:動(dòng)畫的結(jié)束值
Log.d("print", "fraction: " + fraction + "\nstartValue "+ startValue + " \nendValue" + endValue);
return ((Integer)startValue + ((Integer)endValue - (Integer)startValue) * fraction);
}
}
本文參考文章:
Android應(yīng)用開發(fā)之所有動(dòng)畫使用詳解
Android屬性動(dòng)畫詳解
Android插值器與估值器分析
官網(wǎng)文檔:android developer