Android開發藝術探索 第7章 動畫深入分析

LiuJian-Android發表於2019-01-31

Android動畫可以分為三種:View動畫,幀動畫和屬性動畫;屬性動畫為API11的新特性,在低版本是無法直接使用屬性動畫的。

本章主要學習內容:

  • 1.View動畫以及自定義View動畫

  • 2.View動畫的一些特殊使用場景

  • 3.對屬性動畫做了一個全面的介紹

  • 4.使用動畫的一些注意事項


7.1View動畫

  • 1.View動畫的四種變換效果對應著Animation的四個子類:TranslateAnimation(平移動畫)、ScaleAnimation(縮放動畫)、RotateAnimation(旋轉動畫)和AlphaAnimation(透明度動畫),他們既可以用程式碼建立也可以用XML來定義,推薦使用可讀性更好的XML來定義
  • 2.標籤標示動畫集合,對應AnimationSet類,他可以包含若干個動畫,並且他的內部也可以巢狀其他動畫集合。android:interpolator標示動畫集合所採用的差值器,差值器影響動畫速度,比如非勻速動畫就需要通過差值器來控制動畫的播放過程。android:shareInterpolator表示集合中的動畫是否和集合共享同一個差值器,如果集合不指定差值器,那麼自動化就需要單獨制定所需要的差值器或者預設值。
  • 3.Animation通過setAnimationListener方法可以給View動畫新增過程監聽
  • 4.自定義View動畫只需要繼承Animation這個抽象類,並重寫initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中進行相應的矩陣變換,很多時候需要採用Camera來簡化矩陣變換過程。
  • 5幀動畫是順序播放一組預先定義好的圖片,類似電影播放;使用簡單但容易引發OOM,儘量避免使用過多尺寸較大的圖片。

7.2View動畫的特殊使用場景

  • 1.LayoutAnimation作用於ViewGroup,為ViewGroup指定一個動畫,當它的子元素出場的時候都會具有這種動畫,ListView上用的多,LayoutAnimation也是一個View動畫。

Android開發藝術探索 第7章 動畫深入分析
使用LayoutAnimation
Android開發藝術探索 第7章 動畫深入分析

  • 2.Activity/Fragment的切換效果 在startActivity(Intent)或finish()之後呼叫overridePendingTransition(int enterAnim,int exitAnim)方法。 Fragment也可以新增切換效果,通過FragmentTransaction中的setCustomAnimations()方法來新增;需要考慮相容性使用View動畫,屬性動畫是API11新引入的。

7.3屬性動畫

AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator

  • 1.屬性動畫可以對任意物件的屬性進行動畫而不僅僅是View,動畫預設間隔300ms,預設幀率10ms/幀。在一個時間間隔內完成物件從一個屬性值到另一個屬性值的改變。

  • 2.android:propertyName表示屬性動畫的作用的屬性的名稱。*

    android:duration表示動畫的時長

    android:valueFrom表示動畫的起始值

    android:valueTo表示屬性的結束值

    android:startOffset表示動畫的延遲時間,當動畫開始後,需要延遲多少毫秒才會真正播放次動畫。

    android:repeatCount表示動畫的重複次數(預設為0,其中-1表示無限迴圈)

    android:repeatMode表示動畫的重複模式(repeat和reverse可選,表示連續重複和逆向重複)

    android:valueType表示android:propertyName所指定的屬性的型別,可選intType/floatType。如果android:propertyName指定的屬性表示顏色,則不需要指定該屬性。

7.3.2理解差值器和估值器

  • 1.時間差值器(TimeInterpolator)的作用是根據時間流逝的百分比來計算出當前屬性值改變的百分比,系統預置的有LinearIn特rpolator(線性插值器:勻速動畫),AcceletateDecelerateInterpolator(加速減速差值器:動畫兩頭慢中獎快),DecelerateInterpolator(減速差值器:動畫越來越慢)

  • 2.估值器(TypeEvaluator)的作用是根據當前屬性改變的百分比來計算改變後屬性值。系統預置有IntEvaluator,FloatEvaluator,ArabEvaluator

    Android開發藝術探索 第7章 動畫深入分析

  • 3.差值器和估值器除了系統提供之外,我們還可以自定義。自定義差值器需要實現Interpolator或者TimeInterpolator;自定義估值器演算法需要實現TypeEvaluator

7.3.4對任意屬性做動畫

  • 1.屬性動畫要求作用的物件提供該屬性的get和set方法,缺一不可

  • 2.如果你的物件沒有對應的get和set方法

    • 請給你的物件加上get和set方法,如果你有許可權的haul(如果直接使用系統的類,是無法加上的)

    • 用一個類來包裝原始物件,簡介為期提供get和set方法

      Android開發藝術探索 第7章 動畫深入分析

    • 採用ValueAnimator,監聽動畫過程,自己實現屬性的改變

      Android開發藝術探索 第7章 動畫深入分析

7.3.5屬性動畫的工作原理

通過反射呼叫get/set方法;屬性動畫需要執行在有Looper的執行緒中。

Android開發藝術探索 第7章 動畫深入分析

7.4使用動畫的注意事項

  • 1.使用幀動畫時,當圖數量較多且圖片解析度較大的時候容易出現OOM,需注意,儘量避免使用幀動畫
  • 2.使用無限迴圈動畫的時候,在Activity退出時及時停止,否則將導致Activity無法釋放從而造成記憶體洩漏
  • 3.View動畫View的影像做動畫,並不是真正的改變了View的狀態,因此有時會出現動畫完成後View無法隱藏(setVisibility(View.Gone)失效),這時候呼叫view.clearAnimation()清理View動畫即可解決
  • 4.不要使用px,使用px會導致不同裝置上有不同的效果
  • 5.View動畫是對View的影像做動畫,View的真實位置沒有變動,也就導致點選View動畫後的位置觸控事件不會響應,屬性動畫不存在這個問題
  • 6.使用動畫的過程中,使用硬體加速可以提高動畫的流暢度
  • 7.動畫在3.0以下的系統存在相容性問題,特殊場景可能無法正常工作,需要做好適配工作。

相關文章