成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android全套動畫使用技巧

移動開發 Android
Animation框架定義了透明度、旋轉、縮放和位移幾種常見的動畫,控制的整個View,實現原理是每次繪制視圖時View所在ViewGroup中的drawChild函數獲取該View的Animation的Transformation值,然后調用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀。如果沒有完成就繼續調用invalidate()函數,啟動下次繪制來驅動動畫,從而完成整個動畫的繪制。

Android全套動畫使用技巧

【引自MrXI的博客】 一、Android View 動畫框架

Animation框架定義了透明度、旋轉、縮放和位移幾種常見的動畫,控制的整個View,實現原理是每次繪制視圖時View所在ViewGroup中的drawChild函數獲取該View的Animation的Transformation值,然后調用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀。如果沒有完成就繼續調用invalidate()函數,啟動下次繪制來驅動動畫,從而完成整個動畫的繪制。

視圖動畫使用簡單,效果豐富,它提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四種動畫方式,并提供動畫集合AnimationSet,混合使用多種動畫。在Android3.0之前,視圖動畫一家獨大,但隨著Android3.0之后屬性動畫框架的推出,它的風光就大不如從前。相比屬性動畫,視圖動畫的一個非常大的缺陷就是不具備交互性,當某個元素發生視圖動畫后,其響應事件的位置還依然在動畫前的地方,所以視圖動畫只能做普通的動畫效果,避免交互的發生。但是它的優點也非常明顯,即效率比較高且使用方便。

視圖動畫使用非常簡單,不僅可以通過XML文件來描述一個動畫過程,同樣也可以使用代碼來控制整個動畫過程。

(1)、透明度動畫

為視圖增加透明度的變換動畫。

  1. AlphaAnimation aa = new AlphaAnimation(0, 1); 
  2.  
  3. aa.setDuration(1000); 
  4.  
  5. view.startAnimation(aa);  

(2)、旋轉動畫

為視圖增加旋轉的變換動畫。

  1. RotateAnimation ra = new RotateAnimation(0, 360, 100, 100); 
  2.  
  3. ra.setDuration(1000); 
  4.  
  5. view.startAnimation(ra);  

其參數分別為旋轉的起始角度和旋轉中心點的坐標,當然,可以通過設置參數來控制旋轉動畫的參考系,這里設置旋轉動畫的參考系為中心。

  1. RotateAnimation ra1 = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_SELF, 0.5F, RotateAnimation.RELATIVE_TO_SELF, 0.5F); 

(3)、位移動畫

為視圖移動時增加位移動畫。

  1. TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300); 
  2.  
  3. ta.setDuration(1000); 
  4.  
  5. view.startAnimation(ta); 

(4)、縮放動畫

為視圖的縮放增加動畫效果

  1. ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2); 
  2.  
  3. sa.setDuration(1000); 
  4.  
  5. view.startAnimation(sa);  

與旋轉動畫一樣,縮放動畫也可以設置羅芳的中心點,設置中心為自身中心效果

  1. ScaleAnimation sa1 = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF, 0.5F); 
  2.  
  3. sa1.setDuration(1000); 
  4.  
  5. view.startAnimation(sa1);  

(5)、動畫集合

通過AnimationSet,可以將動畫以組合的形式展現出來:

  1. AnimationSet as = new AnimationSet(true); 
  2.  
  3. as.setDuration(1000); 
  4.  
  5. AlphaAnimation aa = new AlphaAnimation(0, 1); 
  6.  
  7. aa.setDuration(1000); 
  8.  
  9. as.addAnimation(aa); 
  10.  
  11. RotateAnimation ra = new RotateAnimation(0, 360, 100, 100); 
  12.  
  13. ra.setDuration(1000); 
  14.  
  15. as.addAnimation(ra); 
  16.  
  17. TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300); 
  18.  
  19. ta.setDuration(1000); 
  20.  
  21. as.addAnimation(ta); 
  22.  
  23. ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2); 
  24.  
  25. sa.setDuration(1000); 
  26.  
  27. as.addAnimation(sa); 
  28.  
  29. view.startAnimation(as);  

可以直接拷貝運行代碼看效果!

對于動畫事件,Android也提供了對應的監聽回調,代碼:

  1. as.setAnimationListener(new Animation.AnimationListener() { 
  2.  
  3. @Override 
  4.  
  5. public void onAnimationStart(Animation animation) { 
  6.  
  7. //動畫開始 
  8.  
  9.  
  10. @Override 
  11.  
  12. public void onAnimationEnd(Animation animation) { 
  13.  
  14. //動畫結束 
  15.  
  16.  
  17. @Override 
  18.  
  19. public void onAnimationRepeat(Animation animation) { 
  20.  
  21. //動畫重復 
  22.  
  23.  
  24. });  

二、屬性動畫

由于Android3.0之前已有的動畫框架Animation存在一些局限性——動畫改變的只是顯示,并不能響應事件。因此在Android3.0之后,Google就提出了屬性動畫這樣一個新的動畫框架,實現更豐富的效果。

而在Animator框架中使用最多的就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator進行更精細化控制,只控制一個對象的一個屬性值,而使用多個ObjectAnimator組合到AnimatorSet形成一個動畫。而且ObjectAnimator能夠自動驅動,可以調用setFrameDelay(long frameDelay)設置動畫幀之間的間隙時間。最重要的是,屬性動畫通過調用屬性的get、set方法來真實地控制了一個View的屬性值,因此強大的屬性動畫框架,基本可以實現所有的動畫效果。

(1)、ObjectAnimator

ObjectAnimator是屬性動畫框架中最重要的實行類,創建一個ObjectAnimator只需要通過他的靜態工廠類直接返回一個ObjectAnimator對象。參數包括一個對象和對象的屬性名字,但這個屬性也必須有get和set函數,內部會通過Java反射機制來調用set函數修改對象屬性值。同樣,你也可以調用setInterpolator設置相應的差值器。

接下來試想一下對一個Button添加一個平移動畫,使用以前的動畫框架平移后將不能觸發點擊事件,點擊的有效區域仍然是原來的地方,點擊移動后的地方是不會有點擊事件發生的。而屬性動畫則不同,它真實地改變了一個View的屬性,所以事件響應的區域也同樣發生了改變,這時候點擊移動后的按鈕,就會響應點擊事件了。

屬性動畫平移代碼如下:

  1. ObjectAnimator animator = ObjectAnimator.ofFloat( 
  2.  
  3. imageView, 
  4.  
  5. "translationX"
  6.  
  7. 200F); 
  8.  
  9. animator.setDuration(300); 
  10.  
  11. animator.start();  

在使用ObjectAnimator的時候,有一點非常重要,那就是要操縱的屬性必須具有get、set方法,不然ObjectAnimator就無法生效。下面是常用的屬性:

  • translationX和translationY:這兩個屬性作為一種增量控制著View對象從它布局容器左上角坐標開始的位置。
  • rotation、rotationX和rotationY:這個三個屬性控制View對象圍繞支點進行2D和3D旋轉。
  • scaleX和scaleY:這兩個屬性控制著View對象圍繞他的支點進行2D縮放。
  • pivotX和pivotY:這兩個屬性控制著View對象的支點位置,圍繞這個支點進行旋轉和縮放變換處理。默認情況下,該支點的位置就是View對象的中心點。
  • x和y:這兩個簡單實用的屬性,描述了View對象在它的容器中的最終位置,它是最初的左上角坐標和translationX、translationY值的累積和。
  • alpha:表示View對象的alpha透明度。默認值是1(不透明),0代表完全透明(不可見)。

根據以上得知視圖動畫所實現的動畫效果,這里基本都已經包含了。

那么如果一個屬性沒有get、set方法,屬性動畫是不是就束手無策了呢?答案是否定的,Google在應用層提供了兩種方案來解決這個問題,一個是通過自定義一個屬性類或者包裝類,來間接地給這個屬性增加get、set方法;或者通過ValueAnimator來實現,ValueAnimator在后面的內容中講到,這個先看看使用包裝類的方法給一個屬性增加get、set方法,代碼如下:

  1. private static class WrapperView { 
  2.     private View mTarget; 
  3.  
  4.     public WrapperView(View mTarget) { 
  5.         this.mTarget = mTarget; 
  6.     } 
  7.  
  8.     public int getWidth() { 
  9.         return mTarget.getLayoutParams().width; 
  10.     } 
  11.  
  12.     public void setWidth(int width) { 
  13.         mTarget.getLayoutParams().width = width; 
  14.         mTarget.requestLayout(); 
  15.     } 
  16.  

通過以上代碼,就跟一個屬性包裝了一層,并給它提供了get、set方法。使用時只需要操縱包裝類就可以間接調用到get、set方法了,代碼如下所示:

  1. WrapperView wrapperView = new WrapperView(view); 
  2.  
  3. ObjectAnimator.ofInt(wrapperView, "width", 500).setDuration(5000).start();  

(2)、PropertyValuesHolder

類似視圖動畫中的AnimationSet,在屬性動畫中,如果針對同一個對象的多個屬性,要同時作用多種動畫,可以使用PropertyValuesHolder來實現。比如平移動畫,如果在平移的過程中同時改變X、Y軸的縮放,可以這樣實現,代碼:

  1. PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300); 
  2.  
  3. PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f); 
  4.  
  5. PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f); 
  6.  
  7. ObjectAnimator.ofPropertyValuesHolder(pvh1, pvh2, pvh3).setDuration(1000).start();  

在代碼中,分別使用PropertyValuesHolder 對象控制translationX、scaleX、scaleY這三個屬性,最屌調用ObjectAnimator.ofPropertyValuesHolder方法實現多屬性動畫的共同作用,整個實現方法非常類似AnimatorSet使用。

(3)、ValueAnimator

ValueAnimator在屬性動畫中占用非常重要的地位,雖然不ObjectAnimator那樣耀眼,但它卻是屬性動畫的核心所在,ObjectAnimator也是繼承自ValueAnimator。

  1. public final class ObjectAnimator extends ValueAnimator 

ValueAnimator本身不提供任何動畫效果,它更像一個數值發生器,用來產生具有一定規律的數字,從而讓調用者來控制動畫的實現過程,ValueAnimator的一般使用方法:通常在ValueAnimator的AnimatorUpdateListener中監聽數值的變換,完成動畫的變換。

  1. ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100); 
  2.  
  3. valueAnimator.setTarget(imageView); 
  4.  
  5. valueAnimator.setDuration(1000).start(); 
  6.  
  7. valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
  8.  
  9. @Override 
  10.  
  11. public void onAnimationUpdate(ValueAnimator animation) { 
  12.  
  13.    Float value = (Float) animation.getAnimatedValue(); 
  14.  
  15.    } 
  16.  
  17. });  

(4)、動畫事件的監聽

一個完整的動畫具有Start、Repeat、End、Cancel四個過程,通過Android提供了接口,很方便地監聽到這四個事件:

  1. ObjectAnimator anim = ObjectAnimator.ofFloat(imageView, "alpha", 0.5F); 
  2. anim.addListener(new Animator.AnimatorListener() { 
  3.     @Override 
  4.     public void onAnimationStart(Animator animation) { 
  5.          
  6.     } 
  7.  
  8.     @Override 
  9.     public void onAnimationEnd(Animator animation) { 
  10.  
  11.     } 
  12.  
  13.     @Override 
  14.     public void onAnimationCancel(Animator animation) { 
  15.  
  16.     } 
  17.  
  18.     @Override 
  19.     public void onAnimationRepeat(Animator animation) { 
  20.  
  21.     } 
  22. }); 
  23. anim.start();  

大部分的時候只關心onAnimationEnd事件,所以Android也提供了一個AnimatorListenerAdapter來讓我們選擇必要的事件進行監聽:

  1. anim.addListener(new AnimatorListenerAdapter() { 
  2.     @Override 
  3.     public void onAnimationEnd(Animator animation) { 
  4.         super.onAnimationEnd(animation); 
  5.     } 
  6. });  

(***nimatorSet

對于一個屬性同時作用多個屬性動畫效果,前面已經使用PropertyValuesHolder實現了這樣的效果。而AnimatorSet不僅能實現這樣的效果,同時也能實現更為精確的順序控制。同樣是實現上面使用PropertyValuesHolder演示的那個動畫效果,如果使用AnimatorSet來實現,那么代碼如下:

  1. ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "translationX", 300f); 
  2.  
  3. ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0f, 1f); 
  4.  
  5. ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 0f, 1f); 
  6.  
  7. AnimatorSet animatorSet = new AnimatorSet(); 
  8.  
  9. animatorSet.setDuration(1000); 
  10.  
  11. animatorSet.playTogether(objectAnimator, objectAnimator1, objectAnimator2); 
  12.  
  13. animatorSet.start();  

在屬性動畫中,AnimatorSet正是通過playTogether()、playSquentially()、animSet.play().width()、defore()、after()這些方法來控制多個動畫的協同工作方式,從而做到對動畫播放順序的精確控制。

(6)、在XML中使用屬性動畫

屬性動畫同視圖動畫一樣,也可以直接寫在XML文件中,代碼:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
  4.  
  5. android:duration="1000" 
  6.  
  7. android:propertyName="scaleX" 
  8.  
  9. android:valueFrom="1.0" 
  10.  
  11. android:valueTo="2.0" 
  12.  
  13. android:valueType="floatType"
  14.  
  15. </objectAnimator>  

前提使用XML定義屬性動畫XML文件一定要放在res/animator/filename.xml文件夾下面才能識別,否則不能識別。發現屬性動畫與視圖動畫在XML文件中的寫法很相似。在程序中使用:

  1. Animator anim = AnimatorInflater.loadAnimator(this,R.animator.filename); 
  2.  
  3. anim.setTarget(view); 
  4.  
  5. anim.start();  

(7)、View的animate方法

在Android3.0之后,Google給View增加了animate方法來直接驅動屬性動畫,代碼如下:

  1. imageView.animate() 
  2.         .alpha(0) 
  3.         .y(300) 
  4.         .setDuration(300) 
  5.         .withStartAction(new Runnable() { 
  6.             @Override 
  7.             public void run() { 
  8.  
  9.             } 
  10.         }) 
  11.         .withEndAction(new Runnable() { 
  12.             @Override 
  13.             public void run() { 
  14.                 runOnUiThread(new Runnable() { 
  15.                     @Override 
  16.                     public void run() { 
  17.                          
  18.                     } 
  19.                 }); 
  20.             } 
  21.         }).start();  

三、Android布局動畫

布局動畫是指作用在ViewGroup上,給ViewGroup增加View時添加一個動畫過渡效果。最簡單的布局動畫是在ViewGroup的XML中,使用如下代碼打開布局動畫:

  1. android:animateLayoutChanges="true" 

通過以上設置,當ViewGroup添加到View時,子View會呈現逐漸顯示的過渡效果,不過這個效果是Android默認的顯示的過渡效果,無法使用自定義動畫來替換這個效果。

還可以通過使用LayoutAnimatorController類自定義一個子View的過渡效果,添加一個視圖動畫,使得子View出現的時候有一個縮放的動畫效果,代碼:

  1. LinearLayout ll = (LinearLayout) findViewById(R.id.ll); 
  2. ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1); 
  3. sa.setDuration(2000); 
  4. //設置布局動畫的顯示 
  5. LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5f); 
  6. //設置布局動畫 
  7. ll.setLayoutAnimation(lac);  

LayoutAnimationController 的***個參數,是需要作用的動畫,而第二個參數,則是每個子View顯示的delay時間。當delay時間不為0時,可以設置子View顯示的順序。

  1. //順序 
  2.  
  3. public static final int ORDER_NORMAL = 0; 
  4.  
  5. //隨機 
  6.  
  7. public static final int ORDER_REVERSE = 1; 
  8.  
  9. //反序 
  10.  
  11. public static final int ORDER_RANDOM = 2;  

四、Interpolators——插值器

插值器是動畫一個非常重要的概念,通過插值器Interpolators,可以定義動畫變換速率,這一點非常類似物理中的加速度,起作用主要是控制目標變量的變化值進行對應的變化。

  • AccelerateDecelerateInterpolator 在動畫開始與介紹的地方速率改變比較慢,在中間的時候加速
  • AccelerateInterpolator 在動畫開始的地方速率改變比較慢,然后開始加速
  • AnticipateInterpolator 開始的時候向后然后向前甩
  • AnticipateOvershootInterpolator 開始的時候向后然后向前甩一定值后返回***的值
  • BounceInterpolator 動畫結束的時候彈起
  • CycleInterpolator 動畫循環播放特定的次數,速率改變沿著正弦曲線
  • DecelerateInterpolator 在動畫開始的地方快然后慢
  • LinearInterpolator 以常量速率改變
  • OvershootInterpolator 向前甩一定值后再回到原來位置
  • PathInterpolator 路徑插值器

未完,待續。。。

五、開源代碼庫

***再分享一個自己積攢很久的代碼庫,只有你想不到,沒有用不到的,歡迎star

https://github.com/xijiufu

由于github服務器在美國,有時訪問很慢,還提供了開源中國地址庫,2個倉庫代碼均同步更新:

http://git.oschina.net/xijiufu

責任編輯:龐桂玉 來源: MrXI的博客
相關推薦

2010-01-28 13:12:47

Android使用An

2010-01-25 10:46:29

Android Spi

2010-01-25 18:22:33

Android使用XM

2013-01-08 16:05:23

Android開發布局ViewStub

2016-10-24 14:53:30

Android app使用技巧

2009-12-25 10:11:46

WPF后臺控制動畫

2017-04-05 14:22:06

NPM開發工具

2009-09-22 12:59:58

ibmdwDojo

2011-12-21 09:20:21

2014-07-15 10:23:10

Android補間動畫

2009-09-04 10:45:18

MyEclipse使用

2011-04-01 10:53:43

2011-01-19 14:39:59

Qmail技巧

2011-01-21 14:30:02

Thunderbird技巧

2009-06-18 15:33:40

2023-06-02 22:36:02

鴻蒙彈簧動畫曲線

2010-01-27 14:01:19

Android命令行啟

2010-01-27 10:21:00

Android菜單

2010-01-27 17:45:15

Android應用技巧

2017-03-02 10:30:57

AndroidAndroid Stu技巧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩中文字幕 | 久久久精品一区 | 亚洲人精品午夜 | av电影一区 | 国产一区二区精品在线 | av一区二区三区在线观看 | 成人在线免费电影 | 欧美日产国产成人免费图片 | 欧洲一区二区三区 | 精品综合| 日本精品在线播放 | 久久蜜桃资源一区二区老牛 | 欧美日韩在线观看一区 | 国产综合久久 | 日韩毛片播放 | 国色天香综合网 | 久久香蕉精品视频 | 欧美性a视频 | 婷婷免费在线 | 欧美日韩国产免费 | 国产成人99久久亚洲综合精品 | 在线视频中文字幕 | 91aiai | 国产成人精品a视频一区www | 久久久久久久电影 | 国产一区精品 | 欧美激情综合色综合啪啪五月 | 夜夜久久 | 久久久久久久久99精品 | 欧美韩一区二区三区 | 福利久久 | 狠狠的操 | 午夜久久久久久久久久一区二区 | 国产精华一区 | 欧美精品99| 精品国产一区二区 | 日韩视频精品在线 | 午夜午夜精品一区二区三区文 | 中文字幕成人av | 精品一区二区三区在线播放 | 992tv人人草 久久精品超碰 |