替换视图之间的共享元素转换

时间:2015-08-10 03:36:04

标签: android android-layout android-animation android-view android-transitions

我有一个视图,我正在删除removeView(),然后一个视图用addView()替换它。这两个视图都在FrameLayout中。我希望能够在这些布局中的两个共享图像之间进行共享元素转换,但是真的不知道如何去做这个,因为android工具似乎是用(也许是合理的)想法构建的。只有活动或片段之间的共享元素转换。

目前我最好的想法是自己动手做动画。我这样做是通过将图像的副本绘制到viewOverlay上,删除第一个视图,将第二个视图添加到第二个视图中的位置,然后使第二个视图可见。我打算尝试这条路线并回答我自己的问题,如果它有效,但我希望找到一种更原生的方式来做这件事。

1 个答案:

答案 0 :(得分:4)

我尝试自己的动画的想法绝对是错误的路线(尽管确实有效)。我发现,如果您有被替换的视图,在某些方面共享内容实际上更容易。大多数文档都围绕着使用带有活动和片段的转换,但它们的核心实际上是围绕不断变化的视图构建的。

这篇文章http://blog.stylingandroid.com/transition-animation-part-1/对我有很大的帮助。

基本上我正在做的是:

            // above I've gotten the sharedElements (Views)...
            newSharedElement.setTransitionName("sharedProperty");
            oldSharedElement.setTransitionName("sharedProperty");
            // having android:transitionName in the xml can be easier

            // This transition handles the shared element move based on the shared tansition name
            Transition shared = TransitionInflater.from(context).inflateTransition(android.R.transition.move);
            shared.addTarget(newSharedElement);

            // create a scene container is a parentView (FrameLayout) of both children
            Scene scene = new Scene(container, newChild);

            // everything else is set to Fade, shared element is excluded
            Transition fade = TransitionInflater.from(context).inflateTransition(android.R.transition.fade);
            fade.excludeTarget(newSharedElement, true);

            // combine the translations
            TransitionSet set = new TransitionSet();
            set.addTransition(shared).addTransition(fade);

            // translationize
            TransitionManager.go(scene, set);

Android可以通过多种方式完成转换的每个步骤,如果这不适合您的用例,可以选择很多选项。

还可以获得Shared Element Transitions Between Views (not Activities or Fragments)的帮助。