android Scene
android Scene保存了view层级的状态,并保存了层级中所有view的属性值。动画框架能使用动画进行场景的切换,一般只需要制定exit(退出)动画,不需要制定enter(进入)动画,系统会自动帮我们创建进入动画。
用Layout创建一个场景
用layout创建Scene时,一般这个layout是不变的,只有在layout创建的时候才会加载场景。如果你要改变这个layout的话,需要重新创建Scene。不能用layout的一部分来创建Scene。用layout创建Scene时需要吧Layout当做ViewGroup初始化,然后调用Scene.getSceneForLayout() 。
下面就来动手创建Scene:
主layout-res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/master_layout"> <TextView android:id="@+id/title" ... android:text="Title"/> <FrameLayout android:id="@+id/scene_root"> <include layout="@layout/a_scene" /> </FrameLayout> </LinearLayout>场景一、res/layout/a_scene.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scene_container" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text_view1 android:text="Text Line 1" /> <TextView android:id="@+id/text_view2 android:text="Text Line 2" /> </RelativeLayout>
场景二: res/layout/another_scene.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scene_container" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text_view2 android:text="Text Line 2" /> <TextView android:id="@+id/text_view1 android:text="Text Line 1" /> </RelativeLayout>
现在我们就来创建Scene对象,
Scene mAScene; Scene mAnotherScene; //为Scene创建scene root mSceneRoot = (ViewGroup) findViewById(R.id.scene_root); //创建 scenes mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this); mAnotherScene = Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);
这样场景已经创建成功,下一步就是为场景加上动作。
场景动作在下边这些情况下用处比较大:
1、需要加动画的view,他们不在同一个view层级中,这样就可以操作每个的view进行入场和出场动画。
2、为那些没有自带动画效果的view加效果, 例如ListView中的子view,详情参考Limitations。
为了保证动画的性能问题,要把他们放到线程里,然后调用 Scene.setExitAction() 或者 Scene.setEnterAction()。Framework 会在场景动画开始前调用setExitAction(),场景动画结束后调用 setEnterAction()。
场景变化
Transition类型
AutoTransition:xml中配置<autoTransition/>,默认变化. 淡入淡出,移动 、重计算大小, views, in that order.
Fade:xml中配置<fade/>android:fadingMode="[fade_in |fade_out |fade_in_out]"/>,淡入淡出
ChangeBounds:<changeBounds/>移动并改变大小
一、xml创建一个Transition:
Fade:xml中配置<fade/>android:fadingMode="[fade_in |fade_out |fade_in_out]"/>,淡入淡出
ChangeBounds:<changeBounds/>移动并改变大小
一、xml创建一个Transition:
1、工程中创建 res/transition/ 目录.
2、创建xml资源文件
3、加入Transition节点
2、创建xml资源文件
3、加入Transition节点
res/transition/fade_transition.xml
然后java代码中载入xml资源
<fade xmlns:android="http://schemas.android.com/apk/res/android" />
然后java代码中载入xml资源
Transition mFadeTransition = TransitionInflater.from(this). inflateTransition(R.transition.fade_transition);二、代码中创建 Transition
Transition mFadeTransition = new Fade();场景和Transition都已经创建好了,那么该怎么触发他们呢。
系统为我们提供了TransitionManager类,我们可以通过TransitionManager.go()来把Scene和Transition融合到一块。
TransitionManager.go(mEndingScene, mFadeTransition);如果要融合多种变化的话可以用set来存放他们例如AutoTransiton
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" android:transitionOrdering="sequential"> <fade android:fadingMode="fade_out" /> <changeBounds /> <fade android:fadingMode="fade_in" /> </transitionSet>
没有Scene如何使用转场动画呢
我们不想用Scene,但是又想拥有场景动画的效果。例如:我们在ViewGroup中添加和移除View时,想要友好的提示效果。
TransitionManager.beginDelayedTransition() 可以帮我们实现这个效果。
xml资源文件
res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainLayout" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:id="@+id/inputText" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_width="match_parent" android:layout_height="wrap_content" /> ... </RelativeLayout>
java代码中使用方法如下面事例
private TextView mLabelText; private Fade mFade; private ViewGroup mRootView; ... // Load the layout this.setContentView(R.layout.activity_main); ... // Create a new TextView and set some View properties mLabelText = new TextView(); mLabelText.setText("Label").setId("1"); // Get the root view and create a transition mRootView = (ViewGroup) findViewById(R.id.mainLayout); mFade = new Fade(IN); // Start recording changes to the view hierarchy TransitionManager.beginDelayedTransition(mRootView, mFade); // Add the new TextView to the view hierarchy mRootView.addView(mLabelText); // When the system redraws the screen to show this update, // the framework will animate the addition as a fade in