Android動(dòng)畫詳解

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. Example of a linear animation

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


圖2.Example of a non-linear animation

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

3-1-2.屬性動(dòng)畫主類之間的相互合作
圖3.How animations are calculated

ValueAnimator:是動(dòng)畫的執(zhí)行類,跟蹤動(dòng)畫的時(shí)間,并且它是動(dòng)畫的屬性的當(dāng)前值。

  • TimeInterpolatorValueAnimator封裝了動(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ì)于ValueAnimatorObjectAnimator我們會(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)畫沒有的屬性,然后自己在AnimatorUpdateListeneronAnimationUpdate方法中設(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要是針對(duì)android 中的動(dòng)畫進(jìn)行詳細(xì)描述,并簡(jiǎn)單分析原理;一、概述Android動(dòng)畫分為三種:幀動(dòng)畫(F...
    暮染1閱讀 851評(píng)論 0 0
  • 1 背景 不能只分析源碼呀,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí),剛好有人微博私信讓全面說說Android的動(dòng)畫,所以今...
    未聞椛洺閱讀 2,844評(píng)論 0 10
  • 轉(zhuǎn)載一篇高質(zhì)量博文,原地址請(qǐng)戳這里轉(zhuǎn)載下來方便今后查看。1 背景不能只分析源碼呀,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí),...
    Elder閱讀 2,005評(píng)論 0 24
  • 轉(zhuǎn)載▼ it分類:IOS開發(fā)相關(guān) 下面是官方的說明: 源字符串--->結(jié)果字符串 “/tmp/scratch.ti...
    沐陽(yáng)風(fēng)色閱讀 311評(píng)論 0 0
  • 任我行心里話: 朋友你好,我是任我行。在提筆寫這封信時(shí)內(nèi)心久久不能平靜,因?yàn)榻裉鞂?duì)任我行對(duì)學(xué)操盤訓(xùn)練營(yíng)都是一種磨練...
    sadhusun閱讀 1,586評(píng)論 10 8

友情鏈接更多精彩內(nèi)容