转场,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为共享元素。


转场,Transition,共享元素,技术要点记录_第1张图片

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/


转场,Transition,共享元素,技术要点记录_第2张图片

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


转场,Transition,共享元素,技术要点记录_第3张图片

4.执行配置;

1.自定义value-v21  style.xml Appthem(主题启用转场相关设置)


转场,Transition,共享元素,技术要点记录_第4张图片

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());

你可能感兴趣的:(转场,Transition,共享元素,技术要点记录)