Android 4.4.2引入的超炫动画库

男儿欲遂平生志,六经勤向窗前读。这篇文章主要讲述Android 4.4.2引入的超炫动画库相关的知识,希望能为你提供帮助。

  • 概述
  • 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
Android 4.4.2引入的超炫动画库

文章图片

 
还有github上很火的plaid
(https://github.com/nickbutcher/plaid)
Android 4.4.2引入的超炫动画库

文章图片

在app中适当得使用上Transition能带来较好的用户体验,视频中介绍了该框架的基本使用以及其中核心的一些类和方法,只有学会这些基本的API才能在之后的Activity/Fragment过渡定制一些自己想要的效果。
 
先看官网的一张关系图
Android 4.4.2引入的超炫动画库

文章图片

图中有三个核心的类,分别是Scene、Transition和TransitionManager,下面对这个三个核心类展开分析。
 
1
Scene
Android 4.4.2引入的超炫动画库

文章图片

Scene场景,用于保存布局中所有View的属性值,创建Scene的方式可以通过getSceneForLayout方法
 
getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context)
 
比如:
Android 4.4.2引入的超炫动画库

文章图片

也可以直接new Scene(ViewGroup sceneRoot, View layout)
Android 4.4.2引入的超炫动画库

文章图片

两种方式都需要传SceneRoot,即该场景的根节点。
 
2
Transition
Android 4.4.2引入的超炫动画库

文章图片

Transition过渡动画,前面创建了两个场景,分别保存了视图的一些属性,比如Visibility、position等,Transition就是对于这些属性值的改变定义过渡的效果。从上图可以看到系统内置了一些常用的Transition,Transition的创建可以通过加载xml,如:
 
res/transition/fade_transition.xml
Android 4.4.2引入的超炫动画库

文章图片

然后在代码中:
Android 4.4.2引入的超炫动画库

文章图片

或者直接在代码中:
Android 4.4.2引入的超炫动画库

文章图片

 
3
TransitionManager
TransitionManeger用于将Scene和Transition联系起来,它提供了一系列的方法如setTransition(Scene fromScene, Scene toScene, Transition transition)指明起始场景和结束场景、他们的过渡动画是什么,go(Scene scene, Transition transition),到指定的场景所使用的过渡动画是什么,beginDelayedTransition(ViewGroup sceneRoot, Transition transition),在当前场景到下一帧的过渡效果是什么。比如这里使用go()方法,效果:
Android 4.4.2引入的超炫动画库

文章图片

注意这里两个Scene中红绿两个方块除了位置和大小不一样,id是一致的,transition记录下两个Scene前后属性值,根据属性值的改变执行过渡动画,默认情况下对SceneRoot下的所有View执行动画效果,我们可以通过Transition.addTarget和removeTarget方法选择性添加或移除执行动画的View。
 
4
常用API
有时候我们只想改变当前已展示的视图层级中View的状态,可以通过beginDelayedTransition实现,下面列举系统内置的Transition的使用。
 
AutoTransition
AutoTransition默认的动画效果,对应xml tag为autoTransition
 
其实是以下几个动画组合顺序执行:
Android 4.4.2引入的超炫动画库

文章图片

在代码中使用:
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
ChangeBounds
ChangeBounds对应xml tag为changeBounds,根据前后布局界限的变化执行动画。
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
ChangeClipBounds
ChangeClipBounds对应xml tag为changeClipBounds,作用对象:View的getClipBounds()值
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
ChangeImageTransform
对应xml tag为changeImageTransform,作用对象:ImageView的matrix
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
ChangeScroll
对应xml tag为changeScroll,作用对象:View的scroll属性值
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
ChangeTransform
对应xml tag 为changeTransform,作用对象:View的scale和rotation
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
Explode
对应xml tag为explode,作用对象:View的Visibility
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
Fade
对应xml tag为fade,作用对象:View的Visibility
 
可以在初始化是指定IN或者OUT分别对应淡入和淡出,若不指定默认为淡入淡出效果
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
Slide
对应xml tag为slide,作用对象:View的Visibility
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

 
TransitionSet
对应xml tag为transitionSet
 
可以在代码中创建transitionSet如:
Android 4.4.2引入的超炫动画库

文章图片

也可以通过加载xml布局创建transitionSet:
xml布局长这样:
Android 4.4.2引入的超炫动画库

文章图片

通过transitionOrdering属性设置动画执行的顺序,together表示同时执行,sequential表示顺序执行,在代码中可以调用TransitionSet的setOrdering(int)方法,属性值传ORDERING_SEQUENTIAL或者ORDERING_TOGETHER
 
在代码中:
Android 4.4.2引入的超炫动画库

文章图片

这里结合changeImageTransform和changeTransform,效果如下:
Android 4.4.2引入的超炫动画库

文章图片

 
PathMotion
Android 4.4.2引入的超炫动画库

文章图片

Transition的辅助工具,以path的方式指定过渡效果,两个具体实现类ArcMotion和PatternPathMotion,看下ArcMotion的效果
Android 4.4.2引入的超炫动画库

文章图片
Android 4.4.2引入的超炫动画库

文章图片

它的运动轨迹是条曲线,有兴趣的可以研究下它的实现算法,在源码中有个很萌的图如下:
Android 4.4.2引入的超炫动画库

文章图片

 
自定义Transition
除了系统内置的Transition,我们还可以自定义Transition效果,需要继承Transition
Android 4.4.2引入的超炫动画库

文章图片

其工作原理是在captureStartValues和captureEndValues中分别记录View的属性值,官网建议确保属性值不冲突,属性值的命名格式参考:
package_name:transition_name:property_name
 
在createAnimator中创建动画,对比属性值的改变执行动画效果,如自定义修改颜色动画效果:
Android 4.4.2引入的超炫动画库

文章图片

在两个Scene中使用自定义过渡动画,效果如下:
Android 4.4.2引入的超炫动画库

文章图片

 
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引入的超炫动画库】不要对包含文本的视图的大小进行动画

    推荐阅读