转场,Transition,共享元素,技术要点记录
学习文章链接 :
http://rkhcy.github.io/2017/09/27/TransitionNote2/
http://rkhcy.github.io/2017/09/21/TransitionNote/
1.历史渊源与区别;
从4.0引入转入转场,无特别实现,4.4(19)引入Scene、Transition和TransitionManager,只提供同一页面不同view的转场自定义动画。5.0(21)后引入Content Transition与ShareElement Transition,前者提供Activity/Fragment的页面切换动画,后者提供Activity/Fragment切换动画期间加入特定View的转场动画,一般称特定View为共享元素。
2.相关方法调用;
1.Scene(场景):
mScene0 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene0, getContext());
mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.scene1, getContext());
或
View view0 = inflater.inflate(R.layout.scene0, container, false);
View view1 = inflater.inflate(R.layout.scene1, container, false);
mScene0 = new Scene(mSceneRoot, view0);
mScene1 = new Scene(mSceneRoot, view1);
要注意的:R.layout.scene0与R.layout.scene1布局View Id相同的进行相关的转换,比如位置,大小,颜色等一般属性,无对应id的view视为新为新增,执行的是VIsiable的动画。
2. Transition(转换,动画的实现) http://rkhcy.github.io/2017/09/21/TransitionNote/
3. TransitionManager
只有二个方法:
1.TransitionManager.beginDelayedTransition(ViewGroup sceneRoot, Transition transition),在当前场景到下一帧的过渡效果是什么。
2.TransitionManager.go(Scene scene, Transition transition)到指定的场景所使用的过渡动画是什么.
4.Android 5.0 21以上的转场动画;
1. Content Transition 无共享元素的转场;
Intent intent =newIntent(this,ContentTransitionsActivity.class);
ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this);
startActivity(intent,activityOptionsCompat.toBundle());
注意:1.转场是否执行,有时与父布局有关,CardView的子view不行(Cardview不定义transition,子viewp字义时,不执行,原因不明)。
2.父布局有定义transition时,子View的transition会失效。
3.同一布局定义多次transition时,以第一个为准。
4.如果某view被定义了是作为共享元素执行对象,则在Content Transition transition文件里定义的一切转场动画无效。
2. ShareElement Transition 有共享元素转场;
Intent intent =newIntent(ActivityA.this,ActivityB.class);
intent.putExtra("url",planet.url);
注意此处:与上面的调用多了二参数,可传单个或多个共享元素(View),通过另一个方法传入(ActivityOptions.makeSceneTransitionAnimation(Activity activity,Pair... sharedElements));
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,sharedImage,"sharedElementName (这里定义的要与ActivityB相对应View的属性android:transitionName一致)");或
ActivityOptionsCompat.makeSceneTransitionAnimation(this,newPair(shared_image,"shared_image_"),newPair(shard_text,"shared_text_"));
startActivity(intent,options.toBundle());
3.transition.xml
4.执行配置;
1.自定义value-v21 style.xml Appthem(主题启用转场相关设置)
2.有转场有页面主动调Finish时,要注意是调finishAfterTransition();相关的动画才会执行。
3.Fragment切换Activity时,Activity的转场动画都正常,Fragment的转场动画不执行,原因是Fragment没有退出也没有加入。但,同类切换时不会有问题。
// 允许使用transitionsgetWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// 指定进入、退出、返回、重新进入时的transitions
getWindow().setEnterTransition(newExplode());
getWindow().setExitTransition(newExplode());
getWindow().setReturnTransition(newExplode());
getWindow().setReenterTransition(newExplode());
// 指定进入、退出、返回、重新进入时的共享transitionsgetWindow().setSharedElementEnterTransition(newChangeTransform());
getWindow().setSharedElementExitTransition(newChangeTransform());
getWindow().setSharedElementReturnTransition(newChangeTransform());
getWindow().setSharedElementReenterTransition(newChangeTransform());