欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

圖文詳解Android屬性動畫

 更新時間:2015年12月16日 09:26:07   作者:孫群  
這篇文章主要以圖文結(jié)合的方式詳細介紹了Android屬性動畫,本文主要講解如何使用屬性動畫,需要的朋友可以參考下

 Android中的動畫分為視圖動畫(View Animation)、屬性動畫(Property Animation)以及Drawable動畫。從Android 3.0(API Level 11)開始,Android開始支持屬性動畫,本文主要講解如何使用屬性動畫。關(guān)于視圖動畫可以參見博文《Android四大視圖動畫圖文詳解》。

一、概述

視圖動畫局限比較大,如下所述:

1、視圖動畫只能使用在View上面。

2、視圖動畫并沒有真正改變View相應(yīng)的屬性值,這導(dǎo)致了UI效果與實際View狀態(tài)存在差異,并導(dǎo)致了一系列怪異行為,比如在使用了視圖動畫TranslateAnimation的View的UI上對其觸摸,你可能驚訝地發(fā)現(xiàn)并沒有觸發(fā)觸摸事件。

鑒于視圖動畫以上缺陷,從Android 3.0引入了屬性動畫。屬性動畫具有以下特性:

1、屬性動畫應(yīng)用面更廣,不僅僅應(yīng)用于View,可以將其應(yīng)用到任意的對象上面,且該對象不需要具有UI界面。

2、當(dāng)將屬性動畫作用于某個對象時,可以通過調(diào)用對象的setXXX方法實際改變對象的值。所以,當(dāng)將屬性動畫作用于某個View時,View對象對應(yīng)的屬性值會被改變。

我們看一下屬性動畫時如何工作的。

其實屬性動畫的工作原理并不復(fù)雜,假設(shè)一個對象有一個屬性x,我們想通過屬性動畫動態(tài)更改該值,假設(shè)我們想在40ms內(nèi)將x的值從0漸變到40,那么如下圖所示:

隨著時間的增長,對應(yīng)的x值也相應(yīng)地線性漸變,當(dāng)動畫完成時,x的值就是我們設(shè)置的最終值40。如果x值線性漸變,那么x的變化速度就是勻速的。其實,我們也可以變速地改變x的值,這會我們可以一開始加速增加x的值,后面減速增加x的值,如下圖所示:

如上圖所示,在前20ms,x值加速增大,在后20ms,x值增大的速度降低。

其實,每種改變x值速度的方式都叫做時間插值器TimeInterpolator,第一張圖中使用的時間插值器叫做LinearInterpolator,第二張圖中使用的時間插值器叫做AccelerateDecelerateInterpolator。動畫開始后,時間插值器會根據(jù)對應(yīng)的算法計算出某一時刻x的值,然后我們就可以用該計算出的值更新對象中x屬性的值,這就是屬性動畫的基本工作原理。

屬性動畫中主要的類如下圖所示:

下面會對上述類分別進行講解。

Animator

屬性動畫主要的類都在android.animation命名空間下,Animator是屬性動畫的基類,其是一個抽象類,該類定義了許多重要的方法,如下所示:

  • setDuration(long duration)

通過setDuration方法可以設(shè)置動畫總共的持續(xù)時間,以毫秒為單位。

  • start()

通過start方法可以啟動動畫,動畫啟動后不一定會立即運行。如果之前通過調(diào)用setStartDelay方法設(shè)置了動畫延遲時間,那么會在經(jīng)過延遲時間之后再運行動畫;如果沒有設(shè)置過動畫的延遲時間,那么動畫在調(diào)用了start()方法之后會立即運行。在調(diào)用了start()方法之后,動畫的isStarted()方法就會返回true;在動畫真正運行起來之后,動畫的isRunning()方法就會返回true,這時候動畫才會調(diào)用TimeInterpolator才開始工作計算屬性在某個時刻的值。調(diào)用動畫的start()方法所在的線程必須綁定了一個Looper對象,如果沒有綁定就會報錯。當(dāng)然,UI線程(即主線程)早就默認綁定了一個Looper對象,所以在主線程中我們就無需擔(dān)心這個問題。如果我們想在一個View上使用屬性動畫,那么我們應(yīng)該保證我們是在UI線程上調(diào)用的動畫的start()方法。start()方法運行后會觸發(fā)動畫監(jiān)聽器AnimatorListener的onAnimationStart方法的執(zhí)行。

  • setStartDelay(long startDelay)

可以通過調(diào)用setStartDelay方法設(shè)置動畫的延遲運行時間,比如調(diào)用setStartDelay(1000)意味著動畫在執(zhí)行了start()方法1秒之后才真正運行,這種情況下,在調(diào)用了start()方法0.5秒之后,isStarted()方法返回true,表示動畫已經(jīng)啟動了,但是isRunning()方法返回false,表示動畫還未真正運行;在start()方法執(zhí)行1秒之后,isStarted()方法還是返回true,isRunning()方法也返回了true,表示動畫已經(jīng)真正開始運行了。通過調(diào)用getStartDelay()方法可以返回我們設(shè)置的動畫延遲啟動時間,默認值是0。

  • setInterpolator(TimeInterpolator value)

我們可以通過調(diào)用setInterpolator方法改變動畫所使用的時間插值器,由于視圖動畫也需要使用時間插值器,所以我們可以使用android.view.animation命名空間下的一系列插值器,將其與屬性動畫一起工作。通過動畫的getInterpolator方法可以獲取我們設(shè)置的時間插值器。

  • setTarget(Object target)

可以通過調(diào)用動畫的setTarget方法設(shè)置其要操作的對象,這樣可以更新該對象的某個屬性值。實際上,該方法對于ValueAnimator作用不大,因為ValueAnimator不是直接與某個對象打交道的。setTarget方法對于ObjectAnimator作用較大,因為ObjectAnimator需要綁定某個要操作的對象,下面會詳細介紹。

  • pause()

Android中API Level 19在Animator中加入了pause()方法,該方法可以暫停動畫的執(zhí)行。調(diào)用pause()方法的線程必須與調(diào)用start()方法的線程是同一個線程。如果動畫還沒有執(zhí)行start()或者動畫已經(jīng)結(jié)束了,那么調(diào)用pause()方法沒有任何影響,直接被忽略。當(dāng)執(zhí)行了pause()方法后,動畫的isPaused()方法會返回true。pause()方法運行后會觸發(fā)動畫監(jiān)聽器AnimatorPauseListener的onAnimationPause方法的執(zhí)行。

  • resume()

如果動畫通過調(diào)用pause()方法暫停了,那么之后可以通過調(diào)用resume()方法讓動畫從上次暫停的地方繼續(xù)運行。resume()方法也是從API Level 19引入的,并且調(diào)用resume()方法的線程必須與調(diào)用start()方法的線程是同一個線程。如果動畫沒有處于暫停狀態(tài)(即isPaused()返回false),那么調(diào)用resume()方法會被忽略。resume()方法運行后會觸發(fā)動畫監(jiān)聽器AnimatorPauseListener的onAnimationResume方法的執(zhí)行。

  • end

end()方法執(zhí)行后,動畫會結(jié)束運行,直接從當(dāng)前狀態(tài)跳轉(zhuǎn)到最終的完成狀態(tài),并將屬性值分配成動畫的終止值,并觸發(fā)動畫監(jiān)聽器AnimatorListener的onAnimationEnd方法的執(zhí)行。

  • cancel()

cancel()方法執(zhí)行后,動畫也會結(jié)束運行,但是與調(diào)用end方法不同的是,其不會將屬性值分配給動畫的終止值。比如一個動畫在400ms內(nèi)將對象的x屬性從0漸變?yōu)?0,當(dāng)運行到第200ms時調(diào)用了cancel()方法,那么屬性x的最終值是20,而不是40,這是與調(diào)用end()方法不同的,如果在第200ms調(diào)用了end()方法,那么屬性x的最終值是40。調(diào)用cancel()方法后,會先觸發(fā)AnimatorListener的onAnimationCancel方法的執(zhí)行,然后觸發(fā)onAnimationEnd方法的執(zhí)行。

  • clone()

Animator實現(xiàn)了java.lang.Cloneable接口。Animator的clone()方法會對動畫進行拷貝,但是該方法默認實現(xiàn)的只是淺拷貝,子類可以重寫該方法以實現(xiàn)深拷貝。

  • addListener (Animator.AnimatorListener listener)

可以通過addListener方法向Animator添加動畫監(jiān)聽器,該方法接收的是AnimatorListener接口類型的參數(shù),其具有四個方法:onAnimationStart、onAnimationCancel、onAnimationEnd、onAnimationRepeat。我們上面已經(jīng)介紹了前三個方法,onAnimationRepeat方法會在動畫在重復(fù)播放的時候被回調(diào)。Android中的AnimatorListenerAdapter類是個抽象類,其實現(xiàn)了AnimatorListener接口,并為所有方法提供了一個空實現(xiàn)。

  • addPauseListener (Animator.AnimatorPauseListener listener)

可以通過addPauseListener方法可以向Animator添加動畫暫停相關(guān)的監(jiān)聽器,該方法接收的是AnimatorPauseListener接口類型的參數(shù),具有兩個方法:onAnimationPause和onAnimationResume,上面已經(jīng)提到過,在此不再贅述。AnimatorListenerAdapter同樣也實現(xiàn)了AnimatorPauseListener接口,并為所有方法提供了一個空實現(xiàn)。

ValueAnimator

ValueAnimator繼承自抽象類Animator。要讓屬性動畫漸變式地更改對象中某個屬性的值,可分兩步操作:第一步,動畫需要計算出某一時刻屬性值應(yīng)該是多少;第二步,需要將計算出的屬性值賦值給動畫的屬性。ValueAnimator只實現(xiàn)了第一步,也就是說ValueAnimator只負責(zé)以動畫的形式不斷計算不同時刻的屬性值,但需要我們開發(fā)者自己寫代碼將計算出的值通過對象的setXXX等方法更新對象的屬性值。

ValueAnimator中有兩個比較重要的屬性,一個是TimeInterpolator類型的屬性,另一個是TypeEvaluator類型的屬性。TimeInterpolator指的就是時間插值器,在上面我們已經(jīng)介紹過,在此不再贅述。TypeEvaluator是什么呢?TypeEvaluator表示的是ValueAnimator對哪種類型的值進行動畫處理。ValueAnimator提供了四個靜態(tài)方法ofFloat()、ofInt()、ofArgb()和ofObject(),通過這四個方法可以對不同種類型的值進行動畫處理,這四個方法對應(yīng)了四種TypeEvaluator,下面會詳細說明。

  • public static ValueAnimator ofFloat (float… values)

ofFloat方法接收一系列的float類型的值,其內(nèi)部使用了FloatEvaluator。通過該方法ValueAnimator可以對float值進行動畫漸變,其使用方法如下所示:

 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 500f);

  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
      float deltaY = (float)animation.getAnimatedValue();
      textView.setTranslationY(deltaY);
    }
  });

  //默認duration是300毫秒
  valueAnimator.setDuration(3000);
  valueAnimator.start();

其效果如下所示:

我們通過構(gòu)造函數(shù)指定了動畫的起始值為0,終止值為500,動畫的默認持續(xù)時間是300毫秒,我們通過setDuration()方法設(shè)置為3000毫秒。該動畫會在3秒內(nèi),將值從0到500動畫漸變。ValueAnimator提供了一個addUpdateListener方法,可以通過該方法向其添加AnimatorUpdateListener類型的監(jiān)聽器。AnimatorUpdateListener有一個onAnimationUpdate方法,ValueAnimator會每隔一定時間(默認間隔10ms)計算屬性的值,每當(dāng)計算的時候就會回調(diào)onAnimationUpdate方法。在該方法中,我們通過調(diào)用ValueAnimator的getAnimatedValue()方法獲取到當(dāng)前動畫計算出的屬性值,然后我們將該值傳入textView的setTranslationY()方法中,從而更新了textView的位置,這樣就通過ValueAnimator以動畫的形式移動textView。

  • public static ValueAnimator ofInt (int… values)

ofInt方法與ofFloat方法很類似,只不過ofInt方法接收int類型的值,ofInt方法內(nèi)部使用了IntEvaluator,其具體使用可參考上面ofFloat的使用代碼,在此不再贅述。

  • public static ValueAnimator ofArgb (int… values)

從API Level 21開始,ValueAnimator中加入了ofArgb方法,該方法接收一些列代表了顏色的int值,其內(nèi)部使用了ArgbEvaluator,可以用該方法實現(xiàn)將一個顏色動畫漸變到另一個顏色,我們從中可以不斷獲取中間動畫產(chǎn)生的顏色值。你可能納悶,既然傳入的還是int值,那直接用ofInt方法不就行了嗎,干嘛還要新增一個ofArgb方法呢?實際上用ofInt方法是不能完成顏色動畫漸變的。我們知道一個int值包含四個字節(jié),在Android中第一個字節(jié)代表Alpha分量,第二個字節(jié)代表Red分量,第三個字節(jié)代表Green分量,第四個字節(jié)代表Blue分量,且我們常用16進制表示顏色,這樣看起來更明顯易懂一些,比如int值0xffff0000表示的紅色,0xff00ff00表示的是綠色,最前面的ff表示的是Alpha。ofArgb方法會通過ArgbEvaluator將顏色拆分成四個分量,然后分別對各個分量進行動畫計算,然后將四個計算完的分量再重新組合成一個表示顏色的int值,這就是ofArgb方法的工作原理。使用方法如下所示:

 //ValueAnimator.ofArgb()方法是在API Level 21中才加入的
  if(Build.VERSION.SDK_INT >= 21){
    //起始顏色為紅色
    int startColor = 0xffff0000;
    //終止顏色為綠色
    int endColor = 0xff00ff00;
    ValueAnimator valueAnimator = ValueAnimator.ofArgb(startColor, endColor);
    valueAnimator.setDuration(3000);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
        int color = (int)animation.getAnimatedValue();
        textView.setBackgroundColor(color);
      }
    });
    valueAnimator.start();
  }

效果如下所示:

我們將TextView的顏色通過動畫從紅色漸變到綠色。

  • public static ValueAnimator ofObject (TypeEvaluator evaluator, Object… values)

由于我們要進行動畫處理的值是各種各樣的,可能不是float、int或顏色值,那我們怎么使用屬性動畫呢?為此,ValueAnimator提供了一個ofObject方法,該方法接收一個TypeEvaluator類型的參數(shù),我們需要實現(xiàn)該接口TypeEvaluator的evaluate方法,只要我們實現(xiàn)了TypeEvaluator接口,我們就能通過ofObject方法處理任意類型的數(shù)據(jù)。我們之前提到ofArgb方法是從API Level 21才引入的,如果我們想在之前的這之前的版本中使用ofArgb的功能,怎么辦呢?我們可以擴展TypeEvaluator,從而通過ofObject方法實現(xiàn)ofArgb方法的邏輯,如下所示:

  //起始顏色為紅色
  int startColor = 0xffff0000;
  //終止顏色為綠色
  int endColor = 0xff00ff00;
  ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator() {
    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
      //從初始的int類型的顏色值中解析出Alpha、Red、Green、Blue四個分量
      int startInt = (Integer) startValue;
      int startA = (startInt >> 24) & 0xff;
      int startR = (startInt >> 16) & 0xff;
      int startG = (startInt >> 8) & 0xff;
      int startB = startInt & 0xff;

      //從終止的int類型的顏色值中解析出Alpha、Red、Green、Blue四個分量
      int endInt = (Integer) endValue;
      int endA = (endInt >> 24) & 0xff;
      int endR = (endInt >> 16) & 0xff;
      int endG = (endInt >> 8) & 0xff;
      int endB = endInt & 0xff;

      //分別對Alpha、Red、Green、Blue四個分量進行計算,
      //最終合成一個完整的int型的顏色值
      return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
          (int)((startR + (int)(fraction * (endR - startR))) << 16) |
          (int)((startG + (int)(fraction * (endG - startG))) << 8) |
          (int)((startB + (int)(fraction * (endB - startB))));
    }
  }, startColor, endColor);
  valueAnimator.setDuration(3000);
  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
      int color = (int)animation.getAnimatedValue();
      textView.setBackgroundColor(color);
    }
  });
  valueAnimator.start();

以上代碼實現(xiàn)的效果與ofArgb實現(xiàn)的效果是一樣的,都是將TextView從紅色漸變到綠色,就不再附圖了,但是我們可以在API Level 11及以后的版本中都可以使用以上ofObject的代碼,通用性更強。

ObjectAnimator

ObjectAnimator繼承自ValueAnimator。我們之前提到,要讓屬性動畫漸變式地更改對象中某個屬性的值,可分兩步操作:第一步,動畫需要計算出某一時刻屬性值應(yīng)該是多少;第二步,需要將計算出的屬性值賦值給動畫的屬性。ValueAnimator只實現(xiàn)了第一步,也就是說ValueAnimator只負責(zé)以動畫的形式不斷計算不同時刻的屬性值,但需要我們開發(fā)者自己寫代碼在動畫監(jiān)聽器AnimatorUpdateListener的onAnimationUpdate方法中將計算出的值通過對象的setXXX等方法更新對象的屬性值。ObjectAnimator比ValueAnimator更進一步,其會自動調(diào)用對象的setXXX方法更新對象中的屬性值。

ObjectAnimator重載了ofFloat()、ofInt()、ofArgb()和ofObject()等靜態(tài)方法,我們下面依次說明。

  • ofFloat(Object target, String propertyName, float… values)

使用方法如下所示:

 float value1 = 0f;
  float value2 = 500f;
  final ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView, "translationY", value1, value2);
  objectAnimator.setDuration(3000);
  objectAnimator.start();

以上代碼實現(xiàn)的效果與通過ValueAnimator的ofFloat方法實現(xiàn)的效果相同,此處不再附圖,但是可以看出使用ObjectAnimator代碼更簡潔。在構(gòu)造函數(shù)中,我們將textView作為target傳遞給ObjectAnimator,然后指定textView要變化的屬性是translationY,最后指定漸變范圍是從0到500。當(dāng)動畫開始時,ObjectAnimator就會不斷調(diào)用textView的setTranslationY方法以更新其值。我們此處演示的是ObjectAnimator與View一起工作,其實ObjectAnimator可以與任意的Object對象工作。如果要更新某個對象中名為propery的屬性,那么該Object對象必須具有一個setProperty的setter方法可以讓ObjectAnimator調(diào)用。在ofFloat方法最后如果只填入了一個float值,那么ObjectAnimator需要調(diào)用對象的getXXX方法獲取對象初始的屬性值,然后從該初始的屬性值漸變到終止值。

  • ofInt(Object target, String propertyName, int… values)

參見ofFloat的使用方法。

  • ofArgb(Object target, String propertyName, int… values)

使用代碼如下所示:

 //ObjectAnimator.ofArgb()方法是在API Level 21中才加入的
  if(Build.VERSION.SDK_INT >= 21){
    int startColor = 0xffff0000;
    int endColor = 0xff00ff00;
    ObjectAnimator objectAnimator = ObjectAnimator.ofArgb(textView, "backgroundColor", startColor, endColor);
    objectAnimator.setDuration(3000);
    objectAnimator.start();
  }

效果圖參見ValueAnimator中對應(yīng)的圖片。

ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object… values)
使用代碼如下所示:

  

 int startColor = 0xffff0000;
  int endColor = 0xff00ff00;
  ObjectAnimator objectAnimator = ObjectAnimator.ofObject(textView, "backgroundColor", new TypeEvaluator() {
    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {
      int startInt = (Integer) startValue;
      int startA = (startInt >> 24) & 0xff;
      int startR = (startInt >> 16) & 0xff;
      int startG = (startInt >> 8) & 0xff;
      int startB = startInt & 0xff;

      int endInt = (Integer) endValue;
      int endA = (endInt >> 24) & 0xff;
      int endR = (endInt >> 16) & 0xff;
      int endG = (endInt >> 8) & 0xff;
      int endB = endInt & 0xff;

      return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
          (int)((startR + (int)(fraction * (endR - startR))) << 16) |
          (int)((startG + (int)(fraction * (endG - startG))) << 8) |
          (int)((startB + (int)(fraction * (endB - startB))));
    }
  }, startColor, endColor);
  objectAnimator.setDuration(3000);
  objectAnimator.start();

AnimatorSet

AnimatorSet繼承自Animator。AnimatorSet表示的是動畫的集合,我們可以通過AnimatorSet把多個動畫集合在一起,讓其串行或并行執(zhí)行,從而創(chuàng)造出復(fù)雜的動畫效果。

我們想讓TextView先進行旋轉(zhuǎn),然后進行平移,最后進行伸縮,我們可以通過AnimatorSet實現(xiàn)該效果,代碼如下所示:

```
  //anim1實現(xiàn)TextView的旋轉(zhuǎn)動畫
  Animator anim1 = ObjectAnimator.ofFloat(textView, "rotation", 0f, 360f);
  anim1.setDuration(2000);
  //anim2和anim3TextView的平移動畫
  Animator anim2 = ObjectAnimator.ofFloat(textView, "translationX", 0f, 300f);
  anim2.setDuration(3000);
  Animator anim3 = ObjectAnimator.ofFloat(textView, "translationY", 0f, 400f);
  anim3.setDuration(3000);
  //anim4實現(xiàn)TextView的伸縮動畫
  Animator anim4 = ObjectAnimator.ofFloat(textView, "scaleX", 1f, 0.5f);
  anim4.setDuration(2000);


  //第一種方式
  AnimatorSet animatorSet = new AnimatorSet();
  animatorSet.playSequentially(anim1, anim2, anim4);
  animatorSet.playTogether(anim2, anim3);
  animatorSet.start();

  //第二種方式
  /*AnimatorSet anim23 = new AnimatorSet();
  anim23.playTogether(anim2, anim3);
  AnimatorSet animatorSet = new AnimatorSet();
  animatorSet.playSequentially(anim1, anim23, anim4);
  animatorSet.start();*/

  //第三種方式
  /*AnimatorSet animatorSet = new AnimatorSet();
  animatorSet.play(anim1).before(anim2);
  animatorSet.play(anim2).with(anim3);
  animatorSet.play(anim4).after(anim2);
  animatorSet.start();*/
```

效果如下所示:

動畫anim1用于旋轉(zhuǎn)TextView,anim2用于在X軸方向偏移TextView,anim3用于在Y軸方向偏移TextView,anim4用于縮放TextView。我們在以上代碼中提供了三種方式通過AnimationSet把這四個動畫組合到一起,第二種方式和第三種方式被注釋起來了。

其實有很多種辦法實現(xiàn)上述效果,這里只介紹一下上述三種方式的思路。

第一種方式中,調(diào)用了animatorSet.playSequentially(anim1, anim2, anim4),該方法將anim1、anim2以及anim4按順序串聯(lián)起來放到了animatorSet中,這樣首先會讓動畫anim1執(zhí)行,anim1執(zhí)行完成后,會依次執(zhí)行動畫anim2,執(zhí)行完anim2之后會執(zhí)行動畫anim3。通過調(diào)用animatorSet.playTogether(anim2, anim3),保證了anim2和anim3同時執(zhí)行,即動畫anim1完成之后會同時運行anim2和anim3。

第二種方式中,我們首先創(chuàng)建了一個AnimatorSet變量anim23,然后通過anim23.playTogether(anim2, anim3)將anim2和anim3組合成一個小的動畫集合。然后我們再把anim1、anim23以及anim4一起傳入到animatorSet.playSequentially(anim1, anim23, anim4)中,這樣anim1、anim23、anim4會依次執(zhí)行,而anim23中的anim2和anim3會同時執(zhí)行。該方式同時也演示了可以將一個AnimatorSet作為動畫的一部分放入另一個AnimatorSet中。

第三種方式中,我們使用了AnimatorSet的play方法,該方法返回AnimatorSet.Builder類型,animatorSet.play(anim1).before(anim2)確保了anim1執(zhí)行完了之后執(zhí)行anim2,animatorSet.play(anim2).with(anim3)確保了anim2和anim3同時執(zhí)行,animatorSet.play(anim4).after(anim2)確保了anim2執(zhí)行完了之后執(zhí)行anim4。需要說明的是animatorSet.play(anim1).before(anim2)與animatorSet.play(anim2).after(anim1)是完全等價的,之所以在上面代碼中有的寫before,有的寫after,只是為了讓大家多了解一下API。

希望本文對大家學(xué)習(xí)屬性動畫有所幫助。

相關(guān)文章

  • Android模擬用戶點擊的實現(xiàn)方法

    Android模擬用戶點擊的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Android模擬用戶點擊的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Android仿qq消息拖拽效果

    Android仿qq消息拖拽效果

    這篇文章主要為大家詳細介紹了Android仿qq消息拖拽效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android6.0獲取GPS定位和獲取位置權(quán)限和位置信息的方法

    Android6.0獲取GPS定位和獲取位置權(quán)限和位置信息的方法

    今天小編就為大家分享一篇Android6.0獲取GPS定位和獲取位置權(quán)限和位置信息的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Android編程之短信列表的時間顯示實例分析

    Android編程之短信列表的時間顯示實例分析

    這篇文章主要介紹了Android編程之短信列表的時間顯示,實例分析了Android中短信列表的時間顯示及具體注意事項,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Android基于廣播事件機制實現(xiàn)簡單定時提醒功能代碼

    Android基于廣播事件機制實現(xiàn)簡單定時提醒功能代碼

    這篇文章主要介紹了Android基于廣播事件機制實現(xiàn)簡單定時提醒功能代碼,較為詳細的分析了Android廣播事件機制及提醒功能的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android拍照得到全尺寸圖片并進行壓縮

    Android拍照得到全尺寸圖片并進行壓縮

    這篇文章主要介紹了Android拍照得到全尺寸圖片并進行壓縮 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • Android獲取應(yīng)用程序大小的方法

    Android獲取應(yīng)用程序大小的方法

    這篇文章主要介紹了Android獲取應(yīng)用程序大小的方法,有需要的朋友可以參考一下
    2014-01-01
  • Android編程實現(xiàn)圖片透明的方法

    Android編程實現(xiàn)圖片透明的方法

    這篇文章主要介紹了Android編程實現(xiàn)圖片透明的方法,涉及Android針對圖片布局及屬性相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • 深入淺析Android JSON解析

    深入淺析Android JSON解析

    android中網(wǎng)絡(luò)數(shù)據(jù)傳輸是經(jīng)常被用到的,通常我們使用xml或者json,而json更加輕量,便捷,我們使用的更多。我自己在項目中使用很多,今天就說說android中怎么去解析JSON,幫助自己總結(jié)內(nèi)容,同時幫助別人少走彎路
    2015-12-12
  • Android實現(xiàn)伴奏錄音合成MP3

    Android實現(xiàn)伴奏錄音合成MP3

    這篇文章主要為大家詳細介紹了Android實現(xiàn)伴奏錄音合成MP3,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論