Transition(过渡动画效果)
2016-07-09 16:54
417 查看
概览
这个包中的类为view提供scenes& transitions结构
Scenes是指一个封装的视图,包括视图层次结构和各种值(布局相关和其他),一个场景可以直接被定义为一个布局层次或通过代码动态设置。
Transition是当输入一个新场景时,自动激活的动画变化机制。一些过渡功能是自动的,例如,载入一个view时会有一个当前的view淡出,调整边界,重新计算现有view的高度,然后淡入现有view并使之变得可见。还有其它的动画转换属性,例如颜色的改变,它可以被指定在特定场景中发生。最后,开发者可以自定义Transition子类,用以监视特定属性的更改并且当这些属性变化时,自动运行动画。
TransitionManager
用来为特定的场景指定自定义的Transition,并执行它。
接口
Transition.TransitionListener 从转变过渡的监听器接收通知。
类
AutoTransition | 工具类,创建一个缺省转换,淡入/淡出,在一个场景中移动和调整大小,当view改变时。 |
ChangeBounds | 这种转变捕获目标的边界布局视图之前和之后的场景变化,在过渡时赋予这些变化。 |
Fade | 在开始和结束时跟踪目标view的可见性,淡入/淡出view当view变为可见/不可见 |
Scene | 一个场景代表view层次结构中所有属性值的集合 |
Transition | 一个transition持有在场景切换时要运行的动画的所有信息 |
TransitionInflater | 从资源文件中映射(inflate)scenes 和transitions |
TransitionManager | 管理类,管理多个transition的执行顺序 |
TransitionSet | 是transitions的一个子集 |
TransitionValues | 持有transition的缓存的数据结构 |
Visibility | 跟踪目标view动画开始和结束时的可见性 |
Scene
一个场景(scene 意思同游戏开发时的scene )代表着一个view层次结构中的所有属性值的集合。当它在Transition中应用时,一个scene 可以被自动的配置。获得scene 的方法:
构造函数构造Scene(ViewGroup sceneRoot, ViewGroup layout)
通过布局文件获取getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context)
Transition(抽象类)
java.lang.Object | |
↳ | android.transition.Transition |
Known Direct Subclasses ChangeBounds, TransitionSet, Visibility |
Known Indirect Subclasses AutoTransition, Fade |
过渡跟踪可见性相关的属性的变化,并且在目标淡入/淡出时基于这些属性的变化 创建和运行 动画。
注:在
SurfaceView和
TextureView,上,过渡或许无法工作,因为这些view都是在屏幕上展示的。对于SurfaceView,问题在于view的更新在一个非ui
线程中,所有使用过渡的动画(例如移动和调整view)或许会无法同步显示。TextureView 相比较更加兼容过渡,但是有些特别的过渡(如淡入/淡出)或许会无法工作,因为它依赖于
ViewOverlay的功能,这个功能在TextureView不能保证它正常工作。
transition 也能在xml资源文件夹下的
res/transition目录下被定义。transition 资源文件由一个标签名为transition
子类的属性来定义一下属性的转变。例如,这是一个定义了
ChangeBounds过渡的最小资源文件:
<changeBounds/>
注意这个过渡是没有任何属性值的,就像在代码中定义他们一样(属性值)是可选的;从xml资源文件中定义transition 和在代码中创建的差不多。这有一个更加复杂的例子展示了
TransitionSet过渡,并且包含
ChangeBounds和
Fade子过渡:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="sequential">
<changeBounds/>
<fade android:fadingMode="fade_out" >
<targets>
<target android:targetId="@id/grayscaleContainer" />
</targets>
</fade>
</transitionSet>
在这个案例中,transitionOrdering 属性用于TransitionSet 对象从默认的
ORDERING_TOGETHER开始变换,而不是ORDERING_SEQUENTIAL。同样,fade
过渡使用了fadingMode 的out模式,而不是默认的out-in
模式。最后,请注意使用的targets 子标签,它用来设置target ,列表中有一个特定的targetId 来确定这个transition 工作在什么上。使用targets 是可选的,通常被用来在那些限制了检查属性拼写时间不变的view上,或者限制了动画类型的view上。在这个案例中,只有
grayscaleContainer会消失,所以我们选择在这个view上只有fade过渡的限制。
ChangeBounds
该transition 在场景切换时关注布局边界的变化,并且生成相应的改变。在transition的资源文件下使用
changeBounds,,标签可定义一个ChangeBounds。
TransitionSet
一个TransitionSet是子transition(包括其他TransitionSet)的父节点。使用TransitionSet来编排更为复杂的过渡,在设置中设置播放规则为
ORDERING_TOGETHER或
ORDERING_SEQUENTIAL.
例如,AutoTransition使用一个TransitionSet 来按顺序的播放一个Fade(Fade.OUT) ,之后是ChangeBounds,再之后是Fade(Fade.OUT) 过渡。
这个也可以在标准的
TransitionSet和
Transition资源文件下被描述,使用transitionSet标签。在TransitionSet 对象中的子过渡可以通过加入相应的标签来加入。例如,下面的xml描述了一个TransitionSet 播放一个fade,然后是changeboudns过渡:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequential">
<fade/>
<changeBounds/>
</transitionSet>
AutoTransition
创建一个默认转化的实用类,可以实现自动的淡入/淡出,移动,和重定位的效果。在transition的资源文件下使用
autoTransition,标签可定义一个AutoTransition
.
Visibility
该过渡关注目标view的可见性的改变。可见性并不仅仅取决于view中setVisibility(int)所设置的可见性,还取决于view是否在view树中。该类的目的是构造一个实用的子类,如fade,当可见性改变时可以使用可见性的信息来确定运行特定的动画效果。子类应该实现如下的一个或多个方法:onAppear(ViewGroup, TransitionValues, int, TransitionValues, int),
onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int),
Fade
该transition 关注view可见性的变化。整体的可见性取决于所有view和他的直接父view的可见性。该transition 淡出一个特定的view,在原先view的位置被淡出操作取代,这是基于view 在view树种的状态而定的。例如,如果一个view只是简单的从他的父view 上被移除,在这个view消失的同时,它被加入ViewGroupOverlay中。如果一个可见的view变为了
GONE或
INVISIBLE,(不可见),在动画期间,它的可见性会变为VISIBLE。然而,如果一个在层次结构中的view
改变了它的可见性,情况就变得更加复杂了。事实上,如果一个在层次结构中的view在最后一个场景中仍然有父view(移除整个层次结构,而不是在该结构中移除它),这样,它也会被移除而避免由于不正确的从父view中移除它而带来的边界效应。这个情况下唯一的例外就是这个开始场景是直接在布局资源文件中创建的,这样,它就被正确的确认为没有父节点,开始场景就可以开始淡出了。
在transition和Fade的资源文件下使用
fade,,标签可定义一个Fade 。
TransitionManager
管理应用于scene 变化的transitions.使用这个管理者,调用setTransition(Scene, Transition)or
setTransition(Scene, Scene, Transition). 传入被管理的scene 和transition 。为屏幕切换而设置具体的过渡并不是必须的;默认情况下,场景的切换更多的是用
AutoTransition来做些事情。为特定场景而设置的具体的过渡仅仅在应用需要有不同的过渡效果这种情况下才使用。
过渡管理器也可以在xml资源文件中的
res/transition目录下被声明。过渡管理器资源由transitionManagername标签名,包含一个或多个
transition标签,每一个都描述了transition
所应用的两个scene (fromScene & toScene )。例如,下面的资源文件展示了一个简单的场景转换:
<transitionManager xmlns:android="http://schemas.android.com/apk/res/android">
<transition android:fromScene="@layout/transition_scene1"
android:toScene="@layout/transition_scene2"
android:transition="@transition/changebounds"/>
<transition android:fromScene="@layout/transition_scene2"
android:toScene="@layout/transition_scene1"
android:transition="@transition/changebounds"/>
<transition android:toScene="@layout/transition_scene3"
android:transition="@transition/changebounds_fadein_together"/>
<transition android:fromScene="@layout/transition_scene3"
android:toScene="@layout/transition_scene1"
android:transition="@transition/changebounds_fadeout_sequential"/>
<transition android:fromScene="@layout/transition_scene3"
android:toScene="@layout/transition_scene2"
android:transition="@transition/changebounds_fadeout_sequential"/>
</transitionManager>
对于每一个
fromScene和
toScene属性,这里使用的是xml布局文件中的引用。这和通过代码调用
getSceneForLayout(ViewGroup, int, Context).来创建scene 是等价的。对于transition属性,使用的是在
res/transition目录下的关于transition
的引用。
TransitionInflater
主要是从资源文件中展出一个transition 或transitionManager。因此,只有三个函数:从上下文中获取 TransitionInflater: from(Context context)
从资源文件中加载一个transition:inflateTransition(int
resource)
从资源文件中加载一个transitionManager:inflateTransitionManager(int
resource, ViewGroup sceneRoot)
TransitionValues
存储transition缓存值的数据结构。其中的view字段存储的是与目标(tagret )有关的所有值。values 字段是一个map ,持有 根据name选择transition 的信息。这些name 必须唯一以避免被其它transition 重写,例如这个公共约定 project:transition_name:property_name。例如,平台或许会在transition的"Fade"中存储一个"alpha"属性,应该如下:"android:fader:alpha".
这些值通过在捕捉一个场景变换阶段调用
captureStartValues(TransitionValues)来缓存起来,在场景开始和结束时各捕获一次。这些开始/结束值经由transitions的
createAnimator(ViewGroup, TransitionValues, TransitionValues)方法传递进来。
总结
使用过渡动画时,如下的几个是必须的:开始scene和结束scene
过渡动画(transition )及其子类或自定义的子类
管理器
使用管理器管理、设置和播放transition
使用TransitionInflater来从资源文件中获取过渡动画和管理器
使用TransitionValues来管理相关的数据(view &transition )
使用TransitionSet来组织更为复杂的过渡效果
如何自定义过渡动画
继承Transition实现 captureStartValues、 captureEndValues、 createAnimator方法
captureStartValues和captureEndValues分别是捕捉开始/结束时的场景信息,存储在一个TransitionValues中。
在createAnimator中实现自己的动画效果,必须确保开始和结束场景的TransitionValues不为空,使用Animator来创建动画,使用各种Evaluator来平滑过渡效果。
相关文章推荐
- php结合安卓客户端实现查询交互实例
- 全面解析Bootstrap中transition、affix的使用方法
- filters.revealTrans.Transition使用方法小结
- CSS3中Transition属性详解以及示例分享
- 安卓输入框被虚拟键盘挡住的问题(微信开发)
- Android安卓中循环录像并检测内存卡容量
- Eclipse导出安卓apk文件的图文教程
- 在安卓系统中插入表情到光标位置的代码详解
- Almp 安卓系统上搭建本地php服务器环境的步骤
- 谷歌被屏蔽后如何搭建安卓环境
- 安卓APP测试之使用Burp Suite实现HTTPS抓包方法
- 安卓(Android)聊天机器人实现代码分享
- 安卓(android)怎么实现下拉刷新
- Android中Fragment的生命周期与返回栈的管理
- 分享一个安卓的内置多种工具类的Activity
- 安卓系统中实现摇一摇画面振动效果的方法
- java实现获取安卓设备里已安装的软件包
- 安卓(Android)中如何实现滑动导航