1. 程式人生 > >Android 4.4.2引入的超炫動畫庫

Android 4.4.2引入的超炫動畫庫

4.5 1.4.1 name api level image orm 基本 aca 概述

  • 概述

  • Scene

  • Transition

  • TransitionManager

  • 常用API

    • 1.4.1. AutoTransition

    • 1.4.2. ChangeBounds

    • 1.4.3. ChangeClipBounds

    • 1.4.4. ChangeImageTransform

    • 1.4.5. ChangeScroll

    • 1.4.6. ChangeTransform

    • 1.4.7. Explode

    • 1.4.8. Fade

    • 1.4.9. Slide

    • 1.4.10. TransitionSet

    • 1.4.11. PathMotion

    • 1.4.12. 自定義Transition

  • Note

0

概述

Android 4.4.2 (API level 19)引入Transition框架,之後很多APP上都使用該框架做出很酷炫的效果,如 Google Play Newsstand app

技術分享

還有github上很火的plaid

(https://github.com/nickbutcher/plaid)

技術分享

在app中適當得使用上Transition能帶來較好的用戶體驗,視頻中介紹了該框架的基本使用以及其中核心的一些類和方法,只有學會這些基本的API才能在之後的Activity/Fragment過渡定制一些自己想要的效果。

先看官網的一張關系圖

技術分享

圖中有三個核心的類,分別是Scene、Transition和TransitionManager,下面對這個三個核心類展開分析。

1

Scene

技術分享

Scene場景,用於保存布局中所有View的屬性值,創建Scene的方式可以通過getSceneForLayout方法

getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context)

比如:

技術分享

也可以直接new Scene(ViewGroup sceneRoot, View layout)

技術分享

兩種方式都需要傳SceneRoot,即該場景的根節點。

2

Transition

技術分享

Transition過渡動畫,前面創建了兩個場景,分別保存了視圖的一些屬性,比如Visibility、position等,Transition就是對於這些屬性值的改變定義過渡的效果。從上圖可以看到系統內置了一些常用的Transition,Transition的創建可以通過加載xml,如:

res/transition/fade_transition.xml

技術分享

然後在代碼中:

技術分享

或者直接在代碼中:

技術分享

3

TransitionManager

TransitionManeger用於將Scene和Transition聯系起來,它提供了一系列的方法如setTransition(Scene fromScene, Scene toScene, Transition transition)指明起始場景和結束場景、他們的過渡動畫是什麽,go(Scene scene, Transition transition),到指定的場景所使用的過渡動畫是什麽,beginDelayedTransition(ViewGroup sceneRoot, Transition transition),在當前場景到下一幀的過渡效果是什麽。比如這裏使用go()方法,效果:

技術分享

註意這裏兩個Scene中紅綠兩個方塊除了位置和大小不一樣,id是一致的,transition記錄下兩個Scene前後屬性值,根據屬性值的改變執行過渡動畫,默認情況下對SceneRoot下的所有View執行動畫效果,我們可以通過Transition.addTarget和removeTarget方法選擇性添加或移除執行動畫的View。

4

常用API

有時候我們只想改變當前已展示的視圖層級中View的狀態,可以通過beginDelayedTransition實現,下面列舉系統內置的Transition的使用。

AutoTransition

AutoTransition默認的動畫效果,對應xml tag為autoTransition

其實是以下幾個動畫組合順序執行:

技術分享

在代碼中使用:

技術分享技術分享

ChangeBounds

ChangeBounds對應xml tag為changeBounds,根據前後布局界限的變化執行動畫。

技術分享技術分享

ChangeClipBounds

ChangeClipBounds對應xml tag為changeClipBounds,作用對象:View的getClipBounds()值

技術分享技術分享

ChangeImageTransform

對應xml tag為changeImageTransform,作用對象:ImageView的matrix

技術分享技術分享

ChangeScroll

對應xml tag為changeScroll,作用對象:View的scroll屬性值

技術分享技術分享

ChangeTransform

對應xml tag 為changeTransform,作用對象:View的scale和rotation

技術分享技術分享

Explode

對應xml tag為explode,作用對象:View的Visibility

技術分享技術分享

Fade

對應xml tag為fade,作用對象:View的Visibility

可以在初始化是指定IN或者OUT分別對應淡入和淡出,若不指定默認為淡入淡出效果

技術分享技術分享

Slide

對應xml tag為slide,作用對象:View的Visibility

技術分享技術分享

TransitionSet

對應xml tag為transitionSet

可以在代碼中創建transitionSet如:

技術分享

也可以通過加載xml布局創建transitionSet:

xml布局長這樣:

技術分享

通過transitionOrdering屬性設置動畫執行的順序,together表示同時執行,sequential表示順序執行,在代碼中可以調用TransitionSet的setOrdering(int)方法,屬性值傳ORDERING_SEQUENTIAL或者ORDERING_TOGETHER

在代碼中:

技術分享

這裏結合changeImageTransform和changeTransform,效果如下:

技術分享

PathMotion

技術分享

Transition的輔助工具,以path的方式指定過渡效果,兩個具體實現類ArcMotion和PatternPathMotion,看下ArcMotion的效果

技術分享技術分享

它的運動軌跡是條曲線,有興趣的可以研究下它的實現算法,在源碼中有個很萌的圖如下:

技術分享

自定義Transition

除了系統內置的Transition,我們還可以自定義Transition效果,需要繼承Transition

技術分享

其工作原理是在captureStartValues和captureEndValues中分別記錄View的屬性值,官網建議確保屬性值不沖突,屬性值的命名格式參考:

package_name:transition_name:property_name

在createAnimator中創建動畫,對比屬性值的改變執行動畫效果,如自定義修改顏色動畫效果:

技術分享

在兩個Scene中使用自定義過渡動畫,效果如下:

技術分享

5

Note

  1. Android 版本在4.0(API Level 14)到4.4.2(API Level 19)使用Android Support Library’s

  2. 對於 SurfaceView可能不起效果,因為SurfaceView的實例是在非UI線程更新的,因此會造成和其他視圖動畫不同步。

  3. 某些特定的轉換類型在應用到TextureView時可能不會產生所需的動畫效果。

  4. 繼承自AdapterView的如ListView,與該框架不兼容。

  5. 不要對包含文本的視圖的大小進行動畫

Android 4.4.2引入的超炫動畫庫